瀏覽代碼

中间计量,新增计量汇总模式

MaiXinRong 7 年之前
父節點
當前提交
00a02be475
共有 10 個文件被更改,包括 503 次插入34 次删除
  1. 42 3
      DataModules/ZJJLDm.dfm
  2. 137 26
      DataModules/ZJJLDm.pas
  3. 6 0
      Forms/MainFrm.dfm
  4. 1 0
      Forms/MainFrm.pas
  5. 9 0
      Frames/ZJJLFme.dfm
  6. 13 0
      Frames/ZJJLFme.pas
  7. 1 1
      Units/Connections.pas
  8. 22 4
      Units/DataBaseTables.pas
  9. 271 0
      Units/MeasureGatherZJJL.pas
  10. 1 0
      Units/UpdateDataBase.pas

+ 42 - 3
DataModules/ZJJLDm.dfm

@@ -3,7 +3,7 @@ object ZJJLData: TZJJLData
   Left = 704
   Top = 204
   Height = 241
-  Width = 269
+  Width = 281
   object sdpZJJL: TsdADOProvider
     TableName = 'ZJJL'
     Left = 42
@@ -62,7 +62,23 @@ object ZJJLData: TZJJLData
       73696F6E02000453697A6502000001044E616D65060B44726177696E67436F64
       65094669656C644E616D65060B44726177696E67436F64650844617461547970
       650218084461746153697A6502320549734B6579080F4E65656450726F636573
-      734E616D650909507265636973696F6E02000453697A6502000000}
+      734E616D650909507265636973696F6E02000453697A6502000001044E616D65
+      060D47617468657242696C6C734944094669656C644E616D65060D4761746865
+      7242696C6C7349440844617461547970650203084461746153697A6502040549
+      734B6579080F4E65656450726F636573734E616D650909507265636973696F6E
+      02000453697A6502000001044E616D650606425F436F6465094669656C644E61
+      6D650606425F436F64650844617461547970650218084461746153697A650232
+      0549734B6579080F4E65656450726F636573734E616D65090950726563697369
+      6F6E02000453697A6502000001044E616D6506044E616D65094669656C644E61
+      6D6506044E616D650844617461547970650218084461746153697A6503C80005
+      49734B6579080F4E65656450726F636573734E616D650909507265636973696F
+      6E02000453697A6502000001044E616D650605556E697473094669656C644E61
+      6D650605556E6974730844617461547970650218084461746153697A65021405
+      49734B6579080F4E65656450726F636573734E616D650909507265636973696F
+      6E02000453697A6502000001044E616D6506055072696365094669656C644E61
+      6D65060550726963650844617461547970650206084461746153697A65020805
+      49734B6579080F4E65656450726F636573734E616D650909507265636973696F
+      6E02000453697A6502000000}
   end
   object sdvZJJL: TsdDataView
     Active = False
@@ -139,6 +155,29 @@ object ZJJLData: TZJJLData
       7A6502000001044E616D65060A4669656C6456616C7565094669656C644E616D
       65060A4669656C6456616C75650844617461547970650210084461746153697A
       650477EC00000549734B6579080F4E65656450726F636573734E616D65090950
-      7265636973696F6E02000453697A6502000000}
+      7265636973696F6E02000453697A6502000001044E616D650606425F436F6465
+      094669656C644E616D650606425F436F64650844617461547970650218084461
+      746153697A6502320549734B6579080F4E65656450726F636573734E616D6509
+      09507265636973696F6E02000453697A6502000001044E616D6506044E616D65
+      094669656C644E616D6506044E616D6508446174615479706502180844617461
+      53697A6503C8000549734B6579080F4E65656450726F636573734E616D650909
+      507265636973696F6E02000453697A6502000001044E616D650605556E697473
+      094669656C644E616D650605556E697473084461746154797065021808446174
+      6153697A6502140549734B6579080F4E65656450726F636573734E616D650909
+      507265636973696F6E02000453697A6502000001044E616D6506055072696365
+      094669656C644E616D6506055072696365084461746154797065020608446174
+      6153697A6502080549734B6579080F4E65656450726F636573734E616D650909
+      507265636973696F6E02000453697A6502000000}
+  end
+  object sdpZJJLDetail: TsdADOProvider
+    TableName = 'ZJJL_Detail'
+    Left = 200
+    Top = 16
+  end
+  object sddZJJLDetail: TsdDataSet
+    Active = False
+    Provider = sdpZJJLDetail
+    Left = 200
+    Top = 80
   end
 end

+ 137 - 26
DataModules/ZJJLDm.pas

@@ -3,12 +3,12 @@ unit ZJJLDm;
 interface
 
 uses
-  ZjGrid,
+  ZjGrid, MeasureGatherZJJL,
   SysUtils, Classes, DB, DBClient, ADODB, sdIDTree, sdDB, Provider,
   Windows, BillsTree, sdProvider, Variants;
 
 type
-  TZJJLType = (ztFx, ztGcl);
+  TZJJLType = (ztFx, ztGcl, ztGclGather);
 
   TZJJLNode = class
   private
@@ -37,6 +37,8 @@ type
     sdvZJJL: TsdDataView;
     sdpHistory: TsdADOProvider;
     sddHistory: TsdDataSet;
+    sdpZJJLDetail: TsdADOProvider;
+    sddZJJLDetail: TsdDataSet;
     procedure sdvZJJLBeforeValueChange(AValue: TsdValue;
       const NewValue: Variant; var Allow: Boolean);
     procedure sdvZJJLAfterDeleteRecord(ARecord: TsdDataRecord);
@@ -46,6 +48,7 @@ type
     FNewID: Integer;
     FOrgDataList: TList;
 
+    function GetNewCode(ANewID: Integer): string;
     procedure GenerateZJJLNode(ANode: TsdIDTreeNode; AType: Integer);
 
     function CheckLastXmj(AID: Integer): Boolean;
@@ -54,6 +57,7 @@ type
     procedure GenerateLastXmj(ANode: TsdIDTreeNode);
     procedure GenerateNode(ANode: TsdIDTreeNode);
 
+    function CheckLeafNodeMeasureExist(AID: Integer): Boolean;
     procedure GenerateLeafNode(ANode: TsdIDTreeNode);
     procedure GenerateNodeByB_Code(ANode: TsdIDTreeNode);
 
@@ -96,6 +100,7 @@ type
 
     procedure GenerateAll;
     procedure GenerateAllByB_Code;
+    procedure GenerateAllByB_CodeGather;
     procedure AssignedCurData(ARec: TsdDataRecord; ADetailGrid: TZJGrid);
 
     function GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;
@@ -152,6 +157,9 @@ begin
   sddHistory.AddIndex('idxID', 'ID');
   sddHistory.AddIndex('idxHistory', 'BillsID;Type;FieldName');
 
+  sdpZJJLDetail.Connection := AConnection;
+  sddZJJLDetail.Open;
+
   CheckZjjlVerison;
 end;
 
@@ -260,6 +268,7 @@ end;
 procedure TZJJLData.DeleteAll;
 begin
   sddZJJL.DeleteAll;
+  sddZJJLDetail.DeleteAll;
 end;
 
 procedure TZJJLData.RestoreOrgData;
@@ -372,37 +381,15 @@ begin
 end;
 
 procedure TZJJLData.GenerateLeafNode(ANode: TsdIDTreeNode);
-
-  function CheckMeasureExist(AID: Integer): Boolean;
-  var
-    StageRec: TsdDataRecord;
-  begin
-    StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
-    Result := Assigned(StageRec) and
-           ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)
-           or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));
-  end;
-
 begin
   if (ANode.Rec.ValueByName('B_Code').AsString <> '') and
-      CheckMeasureExist(ANode.ID) then
+      CheckLeafNodeMeasureExist(ANode.ID) then
     GenerateZJJLNode(ANode, 1);
 end;
 
 procedure TZJJLData.GenerateZJJLNode(ANode: TsdIDTreeNode;
   AType: Integer);
 
-  function GetNewCode: string;
-  begin
-    with TProjectData(TPhaseData(FPhaseData).ProjectData) do
-    begin
-      Result := ProjProperties.ZJJLPreText;
-      if (Result <> '') and (Result[Length(Result)] <> '-') then
-        Result := Result + '-';
-      Result := Result + Format('%d-%d', [PhaseIndex, FNewID]);
-    end;
-  end;
-
   function GetOrgZJJLNode(ABillsID: Integer): TZJJLNode;
   var
     iIndex: Integer;
@@ -443,7 +430,7 @@ begin
   else if AType = Ord(ztGcl) then
     Rec.ValueByName('BillsCode').AsString := ANode.Rec.ValueByName('B_Code').AsString;
 
-  Rec.ValueByName('Code').AsString := GetFieldValue('Code', GetNewCode);
+  Rec.ValueByName('Code').AsString := GetFieldValue('Code', GetNewCode(FNewID));
   Rec.ValueByName('CertificateCode').AsString := GetFieldValue('CertificateCode', '');
   Rec.ValueByName('FormulaMemo').AsString := GetFieldValue('FormulaMemo', '');
   Rec.ValueByName('RelaFile').AsString := GetFieldValue('RelaFile', '');
@@ -689,6 +676,11 @@ begin
     HistoryRec.ValueByName('BillsID').AsInteger := AZJJL_Rec.ValueByName('BillsID').AsInteger;
     HistoryRec.ValueByName('Type').AsInteger := AZJJL_Rec.ValueByName('Type').AsInteger;
     HistoryRec.ValueByName('FieldName').AsString := AFieldName;
+
+    HistoryRec.ValueByName('B_Code').AsString := AZJJL_Rec.ValueByName('B_Code').AsString;
+    HistoryRec.ValueByName('Name').AsString := AZJJL_Rec.ValueByName('Name').AsString;
+    HistoryRec.ValueByName('Units').AsString := AZJJL_Rec.ValueByName('Units').AsString;
+    HistoryRec.ValueByName('Price').AsFloat := AZJJL_Rec.ValueByName('Price').AsFloat;
   end;
   HistoryRec.ValueByName('FieldValue').AsString := AValue;
 end;
@@ -756,4 +748,123 @@ begin
   end;
 end;
 
+procedure TZJJLData.GenerateAllByB_CodeGather;
+
+  procedure GenerateZJJLGather(AManager: TmgZJJLManager; ANode: TBillsIDTreeNode);
+  var
+    iChild: Integer;
+    vChild: TBillsIDTreeNode;
+  begin
+    if ANode.HasChildren then
+    begin
+      iChild := 0;
+      vChild := TBillsIDTreeNode(ANode.NextNode);
+      while iChild < ANode.PosterityCount do
+      begin
+        if not vChild.HasChildren and CheckLeafNodeMeasureExist(vChild.ID) then
+          AManager.AddZJJLAndDetail(vChild, ANode);
+        vChild := TBillsIDTreeNode(vChild.NextNode);
+        Inc(iChild);
+      end;
+    end
+    else if CheckLeafNodeMeasureExist(ANode.ID) then
+      AManager.AddZJJLAndDetail(ANode, ANode);
+  end;
+
+  procedure GenerateZJJLGatherByNode(AManager: TmgZJJLManager; ANode: TsdIDTreeNode);
+  begin
+    if not Assigned(ANode) then Exit;
+    if ANode.HasChildren and not TBillsIDTreeNode(ANode).Rec.IsGatherZJJL.AsBoolean then
+      GenerateZJJLGatherByNode(AManager, ANode.FirstChild)
+    else
+      GenerateZJJLGather(AManager, TBillsIDTreeNode(ANode));
+    GenerateZJJLGatherByNode(AManager, ANode.NextSibling);
+  end;
+
+  function GetFieldValue(AZJJL: TmgZJJL; const AFieldName, ADefaultValue: string): string;
+  var
+    HistoryRec: TsdDataRecord;
+  begin
+    HistoryRec := sddHistory.FindKey('idxHistory', VarArrayOf([AZJJL.GatherNode.ID, AZJJL.B_Code, AZJJL.Name, AZJJL.Units, AZJJL.Price, Integer(ztGclGather), AFieldName]));
+    if Assigned(HistoryRec) then
+      Result := HistoryRec.ValueByName('FieldValue').AsString
+    else
+      Result := ADefaultValue;
+  end;
+
+  procedure SaveGatherData(AManager: TmgZJJLManager);
+  var
+    i, j: Integer;
+    vZJJL: TmgZJJL;
+    Rec: TsdDataRecord;
+  begin
+    for i := 0 to AManager.ZJJLCount - 1 do
+    begin
+      vZJJL := AManager.ZJJL[i];
+      Rec := sddZJJL.Add;
+      Rec.ValueByName('ID').AsInteger := i + 1;
+      Rec.ValueByName('BillsID').AsInteger := vZJJL.Detail[0].RelaNode.ID;
+      Rec.ValueByName('GatherBillsID').AsInteger := vZJJL.GatherNode.ID;
+      Rec.ValueByName('BillsCode').AsString := vZJJL.B_Code;
+      Rec.ValueByName('B_Code').AsString := vZJJL.B_Code;
+      Rec.ValueByName('Name').AsString := vZJJL.Name;
+      Rec.ValueByName('Units').AsString := vZJJL.Units;
+      Rec.ValueByName('Price').AsFloat := vZJJL.Price;
+
+      Rec.ValueByName('Code').AsString := GetFieldValue(vZJJL, 'Code', GetNewCode(i+1));
+      Rec.ValueByName('CertificateCode').AsString := GetFieldValue(vZJJL, 'CertificateCode', '');
+      Rec.ValueByName('FormulaMemo').AsString := GetFieldValue(vZJJL, 'FormulaMemo', '');
+      Rec.ValueByName('RelaFile').AsString := GetFieldValue(vZJJL, 'RelaFile', '');
+
+      Rec.ValueByName('BGLCode').AsString := GetFieldValue(vZJJL, 'BGLCode', vZJJL.BGLCode);
+      Rec.ValueByName('PegName').AsString := GetFieldValue(vZJJL, 'PegName', '');
+      Rec.ValueByName('BeginPeg').AsString := GetFieldValue(vZJJL, 'BeginPeg', vZJJL.BeginPeg);
+      Rec.ValueByName('EndPeg').AsString := GetFieldValue(vZJJL, 'EndPeg', vZJJL.EndPeg);
+      Rec.ValueByName('FBFXName').AsString := GetFieldValue(vZJJL, 'FBFXName', vZJJL.GatherNode.Rec.Name.AsString);
+      Rec.ValueByName('UnitName').AsString := GetFieldValue(vZJJL, 'UnitName', '');
+      Rec.ValueByName('DrawingCode').AsString := GetFieldValue(vZJJL, 'DrawingCode', vZJJL.DrawingCode);
+      for j := 0 to vZJJL.DetailCount - 1 do
+      begin
+        Rec := sddZJJLDetail.Add;
+        Rec.ValueByName('ID').AsInteger := i + 1;
+        Rec.ValueByName('BillsID').AsInteger := vZJJL.Detail[j].RelaNode.ID;
+      end;
+    end;
+  end;
+
+var
+  vManager: TmgZJJLManager;
+begin
+  vManager := TmgZJJLManager.Create;
+  try
+    DeleteAll;
+    GenerateZJJLGatherByNode(vManager, MainBillsTree.FirstNode);
+    SaveGatherData(vManager);
+    TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := Integer(ztGclGather);
+  finally
+    vManager.Free;
+  end;
+end;
+
+function TZJJLData.CheckLeafNodeMeasureExist(AID: Integer): Boolean;
+var
+  StageRec: TsdDataRecord;
+begin
+  StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
+  Result := Assigned(StageRec) and
+         ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)
+         or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));
+end;
+
+function TZJJLData.GetNewCode(ANewID: Integer): string;
+begin
+  with TProjectData(TPhaseData(FPhaseData).ProjectData) do
+  begin
+    Result := ProjProperties.ZJJLPreText;
+    if (Result <> '') and (Result[Length(Result)] <> '-') then
+      Result := Result + '-';
+    Result := Result + Format('%d-%d', [PhaseIndex, ANewID]);
+  end;
+end;
+
 end.

+ 6 - 0
Forms/MainFrm.dfm

@@ -1124,6 +1124,12 @@ object MainForm: TMainForm
       Hint = #23450#20301#33267#21488#36134#20998#35299
       Visible = ivAlways
     end
+    object dxbtnGclGatherZJJL: TdxBarButton
+      Caption = #35745#37327#27719#24635#26684#24335
+      Category = 0
+      Hint = #35745#37327#27719#24635#26684#24335
+      Visible = ivAlways
+    end
   end
   object Images: TImageList
     DrawingStyle = dsTransparent

+ 1 - 0
Forms/MainFrm.pas

@@ -168,6 +168,7 @@ type
     dxbtnLocateZJJL: TdxBarButton;
     dxbtnEpure: TdxBarButton;
     dxbtnLocateCompileBills: TdxBarButton;
+    dxbtnGclGatherZJJL: TdxBarButton;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure jtsProjectsChange(Sender: TObject; NewTab: Integer;

+ 9 - 0
Frames/ZJJLFme.dfm

@@ -233,6 +233,11 @@ object ZJJLFrame: TZJJLFrame
       ImageIndex = 32
       OnExecute = actnGenerateGclZJJLExecute
     end
+    object actnGenerateGclGatherZJJL: TAction
+      Caption = #35745#37327#27719#24635#27169#24335
+      ImageIndex = 32
+      OnExecute = actnGenerateGclGatherZJJLExecute
+    end
   end
   object dxpmZJJL: TdxBarPopupMenu
     BarManager = MainForm.dxBarManager
@@ -261,6 +266,10 @@ object ZJJLFrame: TZJJLFrame
       item
         Item = MainForm.dxbtnGclZJJL
         Visible = True
+      end
+      item
+        Item = MainForm.dxbtnGclGatherZJJL
+        Visible = True
       end>
     UseOwnFont = False
     OnPopup = dxpmAutoGeneratePopup

+ 13 - 0
Frames/ZJJLFme.pas

@@ -42,6 +42,7 @@ type
     actnGenerateGclZJJL: TAction;
     saZJJL: TsdGridDBA;
     zgDetailInfo: TZJGrid;
+    actnGenerateGclGatherZJJL: TAction;
     procedure actnGenerateExecute(Sender: TObject);
     procedure lePreTextExit(Sender: TObject);
     procedure zgZJJLMouseDown(Sender: TObject; Button: TMouseButton;
@@ -60,6 +61,7 @@ type
       const ACoord: TPoint; var Value: String; DisplayText: Boolean);
     procedure zgDetailInfoCellCanEdit(Sender: TObject;
       const ACoord: TPoint; var Allow: Boolean);
+    procedure actnGenerateGclGatherZJJLExecute(Sender: TObject);
   private
     FZJJLData: TZJJLData;
     FDataReadOnly: Boolean;
@@ -193,6 +195,7 @@ procedure TZJJLFrame.dxpmAutoGeneratePopup(Sender: TObject);
 begin
   SetDxBtnAction(actnGenerateFxZJJL, MainForm.dxbtnFxZJJL);
   SetDxBtnAction(actnGenerateGclZJJL, MainForm.dxbtnGclZJJL);
+  SetDxBtnAction(actnGenerateGclGatherZJJL, MainForm.dxbtnGclGatherZJJL);
 end;
 
 procedure TZJJLFrame.actnGenerateFxZJJLExecute(Sender: TObject);
@@ -215,6 +218,7 @@ begin
   case iType of
     0: FZJJLData.GenerateAll;
     1: FZJJLData.GenerateAllByB_Code;
+    2: FZJJLData.GenerateAllByB_CodeGather;
   end;
   RefreshTitle;
   if (saZJJL.DataView.RecordCount > 0) then
@@ -309,4 +313,13 @@ begin
   Allow := (not FDataReadOnly) and (sFieldName <> '') and Assigned(saZJJL.DataView.Current);
 end;
 
+procedure TZJJLFrame.actnGenerateGclGatherZJJLExecute(Sender: TObject);
+begin
+  with TPhaseData(FZJJLData.PhaseData).PhaseProperty do
+  begin
+    ZJJLType := Integer(ztGclGather);
+    GenerateZJJL;
+  end;
+end;
+
 end.

+ 1 - 1
Units/Connections.pas

@@ -8,7 +8,7 @@ uses
 const
   ProductName = 'Measure';
   EmptyFileVersion = '1.0.0.0';
-  FileVersion = '1.0.1.14';
+  FileVersion = '1.0.1.17';
   EncryptVersion = 'Auto1.0';
   SAdoConnectStr = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;' +
                    'User ID=Admin;Password='''';Persist Security Info=True';

+ 22 - 4
Units/DataBaseTables.pas

@@ -976,7 +976,7 @@ const
 
   // 中间计量表 -- 见文件“计量\需求\变更令\计量支付窗口主界面结构示意.doc”
   SZJJL = 'ZJJL';
-  tdZJJL: array [0..14] of TScFieldDef =(
+  tdZJJL: array [0..19] of TScFieldDef =(
     (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
     // 所属项目节ID -- 仅允许在最底层项目节输入
     (FieldName: 'BillsID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
@@ -1006,16 +1006,34 @@ const
     // 计量单元
     (FieldName: 'UnitName'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
     // 图号
-    (FieldName: 'DrawingCode'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
+    (FieldName: 'DrawingCode'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+
+    // 计量汇总模式特有
+    (FieldName: 'GatherBillsID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'B_Code'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'Name'; FieldType: ftString; Size: 200; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'Units'; FieldType: ftString; Size: 20; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'Price'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
+  );
+
+  SZJJL_Detail = 'ZJJL_Detail';
+  tdZJJL_Detail: array [0..1] of TScFieldDef = (
+    (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
+    (FieldName: 'BillsID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False)
   );
 
   SZJJL_History = 'ZJJL_History';
-  tdZJJL_History: array [0..4] of TScFieldDef =(
+  tdZJJL_History: array [0..8] of TScFieldDef =(
     (FieldName: 'ID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: True; ForceUpdate: False),
     (FieldName: 'BillsID'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'Type'; FieldType: ftInteger; Size: 0; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
     (FieldName: 'FieldName'; FieldType: ftString; Size: 50; Precision: 0; NotNull: True; PrimaryKey: False; ForceUpdate: False),
-    (FieldName: 'FieldValue'; FieldType: ftMemo; Size: 60535; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
+    (FieldName: 'FieldValue'; FieldType: ftMemo; Size: 60535; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    // 计量汇总模式特有
+    (FieldName: 'B_Code'; FieldType: ftString; Size: 50; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'Name'; FieldType: ftString; Size: 200; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'Units'; FieldType: ftString; Size: 20; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False),
+    (FieldName: 'Price'; FieldType: ftDouble; Size: 0; Precision: 0; NotNull: False; PrimaryKey: False; ForceUpdate: False)
   );
 
   // 报表数据

+ 271 - 0
Units/MeasureGatherZJJL.pas

@@ -0,0 +1,271 @@
+unit MeasureGatherZJJL;
+
+interface
+
+uses
+  Classes, BillsTree;
+
+type
+  TmgZJJLDetail = class
+  private
+    FRelaNode: TBillsIDTreeNode;
+  public
+    constructor Create(ADetailNode: TBillsIDTreeNode);
+    destructor destroy; override;
+
+    property RelaNode: TBillsIDTreeNode read FRelaNode;
+  end;
+
+  TmgZJJL = class
+  private
+    FB_Code: string;
+    FName: string;
+    FUnits: string;
+    FPrice: Double;
+    FGatherNode: TBillsIDTreeNode;
+    FDetails: TList;
+    FPegName: string;
+    FBeginPeg: string;
+    FBGLCode: string;
+    FEndPeg: string;
+    FUnitName: string;
+    FDrawingCode: string;
+    FFBFXName: string;
+
+    function FindDetail(ADetailNode: TBillsIDTreeNode): TmgZJJLDetail;
+    function NewDetail(ADetailNode: TMeasureBillsIDTreeNode): TmgZJJLDetail;
+
+    function GetDrawingCode(ANode: TBillsIDTreeNode): string;
+    function GetPeg(ANode: TBillsIDTreeNode): string;
+    procedure FilterPeg;
+
+    function GetDetail(AIndex: Integer): TmgZJJLDetail;
+    function GetDetailCount: Integer;
+  public
+    constructor Create(ADetailNode, AGatherNode: TBillsIDTreeNode);
+    destructor Destroy; override;
+
+    function AddDetail(ADetailNode: TBillsIDTreeNode): TmgZJJLDetail;
+
+    property B_Code: string read FB_Code;
+    property Name: string read FName;
+    property Units: string read FUnits;
+    property Price: Double read FPrice;
+    property GatherNode: TBillsIDTreeNode read FGatherNode;
+
+    property BGLCode: string read FBGLCode;
+    property BeginPeg: string read FBeginPeg;
+    property EndPeg: string read FEndPeg;
+    property DrawingCode: string read FDrawingCode;
+
+    property DetailCount: Integer read GetDetailCount;
+    property Detail[AIndex: Integer]: TmgZJJLDetail read GetDetail;
+  end;
+
+  TmgZJJLManager = class
+  private
+    FZJJLs: TList;
+
+    function FindZJJL(ADetailNode, AGatherNode: TBillsIDTreeNode): TmgZJJL;
+    function NewZJJL(ADetailNode, AGatherNode: TBillsIDTreeNode): TmgZJJL;
+
+    function GetZJJL(AIndex: Integer): TmgZJJL;
+    function GetZJJLCount: Integer;
+  public
+    constructor Create;
+    destructor Destroy; override;
+
+    function AddZJJL(ADetailNode, AGatherNode: TBillsIDTreeNode): TmgZJJL;
+    function AddZJJLAndDetail(ADetailNode, AGatherNode: TBillsIDTreeNode): TmgZJJLDetail;
+
+    property ZJJLCount: Integer read GetZJJLCount;
+    property ZJJL[AIndex: Integer]: TmgZJJL read GetZJJL;
+  end;
+
+implementation
+
+uses
+  sdDB, mDataRecord, ZhAPI, UtilMethods, mPegFilter;
+
+{ TmgZJJL }
+
+function TmgZJJL.AddDetail(ADetailNode: TBillsIDTreeNode): TmgZJJLDetail;
+begin
+  Result := FindDetail(ADetailNode);
+  if not Assigned(Result) then
+    Result := NewDetail(TMeasureBillsIDTreeNode(ADetailNode));
+end;
+
+constructor TmgZJJL.Create(ADetailNode, AGatherNode: TBillsIDTreeNode);
+begin
+  FB_Code := ADetailNode.Rec.B_Code.AsString;
+  FName := ADetailNode.Rec.Name.AsString;
+  FUnits := ADetailNode.Rec.Units.AsString;
+  FPrice := ADetailNode.Rec.Price.AsFloat;
+  FGatherNode := AGatherNode;
+  FDetails := TList.Create;
+  AddDetail(ADetailNode);
+
+  FDrawingCode := GetDrawingCode(AGatherNode);
+  FilterPeg;
+end;
+
+destructor TmgZJJL.Destroy;
+begin
+  ClearObjects(FDetails);
+  FDetails.Free;
+  inherited;
+end;
+
+procedure TmgZJJL.FilterPeg;
+var
+  vPegFilter: TPegStrFilter;
+begin
+  vPegFilter := TPegStrFilter.Create;
+  try
+    vPegFilter.PegStr := GetPeg(FGatherNode);
+    FBeginPeg := vPegFilter.BeginPeg;
+    FEndPeg := vPegFilter.EndPeg;
+  finally
+    vPegFilter.Free;
+  end;
+end;
+
+function TmgZJJL.FindDetail(ADetailNode: TBillsIDTreeNode): TmgZJJLDetail;
+var
+  i: Integer;
+begin
+  Result := nil;
+  for i := 0 to DetailCount - 1 do
+  begin
+    if Detail[i].RelaNode = ADetailNode then
+    begin
+      Result := Detail[i];
+      Break;
+    end;
+  end;
+end;
+
+function TmgZJJL.GetDetail(AIndex: Integer): TmgZJJLDetail;
+begin
+  Result := TmgZJJLDetail(FDetails.Items[AIndex]);
+end;
+
+function TmgZJJL.GetDetailCount: Integer;
+begin
+  Result := FDetails.Count;
+end;
+
+function TmgZJJL.GetDrawingCode(ANode: TBillsIDTreeNode): string;
+begin
+  Result := '';
+  if Assigned(ANode) then
+  begin
+    Result := ANode.Rec.DrawingCode.AsString;
+    if Result = '' then
+      Result := GetDrawingCode(TBillsIDTreeNode(ANode.Parent));
+  end;
+end;
+
+function TmgZJJL.GetPeg(ANode: TBillsIDTreeNode): string;
+begin
+  Result := '';
+  if Assigned(ANode) then
+  begin
+    if CheckPeg(ANode.Rec.Name.AsString) then
+      Result := ANode.Rec.Name.AsString
+    else
+      Result := GetPeg(TBillsIDTreeNode(ANode.Parent));
+  end;
+end;
+
+function TmgZJJL.NewDetail(ADetailNode: TMeasureBillsIDTreeNode): TmgZJJLDetail;
+begin
+  Result := TmgZJJLDetail.Create(ADetailNode);
+  FDetails.Add(Result);
+  if Assigned(ADetailNode.StageRec) then
+    FBGLCode := MergeRelaBGL(FBGLCode, ADetailNode.StageRec.QcBGLCode.AsString);
+end;
+
+{ TmgZJJLDetail }
+
+constructor TmgZJJLDetail.Create(ADetailNode: TBillsIDTreeNode);
+begin
+  FRelaNode := ADetailNode;
+end;
+
+destructor TmgZJJLDetail.destroy;
+begin
+
+  inherited;
+end;
+
+{ TmgZJJLManager }
+
+function TmgZJJLManager.AddZJJL(ADetailNode,
+  AGatherNode: TBillsIDTreeNode): TmgZJJL;
+begin
+  Result := FindZJJL(ADetailNode, AGatherNode);
+  if not Assigned(Result) then
+    Result := NewZJJL(ADetailNode, AGatherNode);
+end;
+
+function TmgZJJLManager.AddZJJLAndDetail(ADetailNode,
+  AGatherNode: TBillsIDTreeNode): TmgZJJLDetail;
+var
+  vZJJL: TmgZJJL;
+begin
+  vZJJL := AddZJJL(ADetailNode, AGatherNode);
+  Result := vZJJL.AddDetail(ADetailNode);
+end;
+
+constructor TmgZJJLManager.Create;
+begin
+  FZJJLs := TList.Create;
+end;
+
+destructor TmgZJJLManager.Destroy;
+begin
+  ClearObjects(FZJJLs);
+  FZJJLs.Free;
+  inherited;
+end;
+
+function TmgZJJLManager.FindZJJL(ADetailNode,
+  AGatherNode: TBillsIDTreeNode): TmgZJJL;
+var
+  i: Integer;
+begin
+  Result := nil;
+  for i := 0 to ZJJLCount - 1 do
+  begin
+    if (ZJJL[i].B_Code = ADetailNode.Rec.B_Code.AsString) and
+       (ZJJL[i].Name = ADetailNode.Rec.Name.AsString) and
+       (ZJJL[i].Units = ADetailNode.Rec.Units.AsString) and
+       (ZJJL[i].Price = ADetailNode.Rec.Price.AsFloat) and
+       (ZJJL[i].GatherNode = AGatherNode) then
+    begin
+      Result := ZJJL[i];
+      Break;
+    end;
+  end;
+end;
+
+function TmgZJJLManager.GetZJJL(AIndex: Integer): TmgZJJL;
+begin
+  Result := TmgZJJL(FZJJLs.Items[AIndex]);
+end;
+
+function TmgZJJLManager.GetZJJLCount: Integer;
+begin
+  Result := FZJJLs.Count;
+end;
+
+function TmgZJJLManager.NewZJJL(ADetailNode,
+  AGatherNode: TBillsIDTreeNode): TmgZJJL;
+begin
+  Result := TmgZJJL.Create(ADetailNode, AGatherNode);
+  FZJJLs.Add(Result);
+end;
+
+end.

+ 1 - 0
Units/UpdateDataBase.pas

@@ -175,6 +175,7 @@ begin
     Updater.AddTableDef(SPhasePay, @tdPhasePay, Length(tdPhasePay), False, False);
     Updater.AddTableDef(SZJJL, @tdZJJL, Length(tdZJJL), False, False);
     Updater.AddTableDef(SZJJL_History, @tdZJJL_History, length(tdZJJL_History), False, False);
+    Updater.AddTableDef(SZJJL_Detail, @tdZJJL_Detail, length(tdZJJL_Detail), False, False);
     Updater.AddTableDef(SReportData, @tdReportData, Length(tdReportData), False, False);
     Updater.ExcuteUpdate;
   finally