123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969 |
- unit ZJJLDm;
- interface
- uses
- ZjGrid, MeasureGatherZJJL,
- SysUtils, Classes, DB, DBClient, ADODB, sdIDTree, sdDB, Provider,
- Windows, BillsTree, sdProvider, Variants;
- type
- TZJJLType = (ztFx, ztGcl, ztGclGather);
- TRefreshDetailGridEvent = procedure of Object;
- TZJJLNode = class
- private
- FBillsID: Integer;
- FCode: string;
- FCertificateCode: string;
- FBillsCode: string;
- FFormulaMemo: string;
- FRelaFile: string;
- FType: Integer;
- end;
- TZJJLInfoRec = Record
- FBFXName: string;
- PegName: string;
- BeginPeg: string;
- EndPeg: string;
- BGLCode: string;
- DrawingCode: string;
- UnitName: string;
- end;
- TZJJLData = class(TDataModule)
- sdpZJJL: TsdADOProvider;
- sddZJJL: TsdDataSet;
- sdvZJJL: TsdDataView;
- sdpHistory: TsdADOProvider;
- sddHistory: TsdDataSet;
- sdpZJJLDetail: TsdADOProvider;
- sddZJJLDetail: TsdDataSet;
- procedure sdvZJJLBeforeValueChange(AValue: TsdValue;
- const NewValue: Variant; var Allow: Boolean);
- procedure sdvZJJLAfterDeleteRecord(ARecord: TsdDataRecord);
- procedure sdvZJJLCurrentChanged(ARecord: TsdDataRecord);
- private
- FPhaseData: TObject;
- FCanModified: Boolean;
- FNewID: Integer;
- FOrgDataList: TList;
- FRefreshDetailGrid: TRefreshDetailGridEvent;
- function GetNewCode(ANewID: Integer): string;
- procedure GenerateZJJLNode(ANode: TsdIDTreeNode; AType: Integer);
- function CheckLastXmj(AID: Integer): Boolean;
- function CheckBGExist(ANode: TsdIDTreeNode): Boolean;
- function CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;
- procedure GenerateLastXmj(ANode: TsdIDTreeNode);
- procedure GenerateNode(ANode: TsdIDTreeNode);
- function CheckLeafNodeMeasureExist(AID: Integer): Boolean;
- procedure GenerateLeafNode(ANode: TsdIDTreeNode);
- procedure GenerateNodeByB_Code(ANode: TsdIDTreeNode);
- procedure DeleteAll;
- procedure RestoreOrgData;
- procedure DeleteHistory(ABillsID, AType: Integer);
- procedure DeleteGatherHistory(ARecord: TsdDataRecord);
- procedure DetailGridCellCanEdit(Sender: TObject; const ACoord: TPoint;
- var Allow: Boolean);
- procedure DetailGridCellTextChanged(Sender: TObject; Col, Row: Integer);
- function GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName, ADef: string): string;
- function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
- function GetBGLCode(ANode: TsdIDTreeNode): string;
- // 取树结构的第ALevel层节点的名称(level从0开始)
- function GetNameByLevel(ANode: TsdIDTreeNode; ALevel: Integer): string;
- function GetFBFXName(ANode, APegNode: TsdIDTreeNode): string;
- function GetPegName(ANode: TsdIDTreeNode): string;
- function GetInfoRecByCode_2(ABillsID: Integer): TZJJLInfoRec;
- function GetInfoRecByB_Code_2(ABillsID: Integer): TZJJLInfoRec;
- function GetInfoRec_2(ABillsID, AType: Integer): TZJJLInfoRec;
- function GetNewHistoryID: Integer;
- procedure SetHistory(const AFieldName, AValue: string; AZJJL_Rec: TsdDataRecord);
- // 向父项检测,直至提取到图册号为止
- function GetDrawingCode(ANode: TsdIDTreeNode): string;
- procedure CheckZjjlVerison;
- function GetMainBillsTree: TsdIDTree;
- public
- constructor Create(APhaseData: TObject);
- destructor Destroy; override;
- procedure Open(AConnection: TADOConnection);
- procedure Save;
- procedure GenerateAll;
- procedure GenerateAllByB_Code;
- procedure GenerateAllByB_CodeGather;
- procedure AssignedCurData(ARec: TsdDataRecord; ADetailGrid: TZJGrid);
- function GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;
- function GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
- function GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;
- function GetZJJLCalcData(ARec: TsdDataRecord; const AFileName: string): Double;
- procedure LocateBills;
- function FindZJJLRecord(ABillsID: Integer): TsdDataRecord;
- property PhaseData: TObject read FPhaseData;
- property MainBillsTree: TsdIDTree read GetMainBillsTree;
- property CanModified: Boolean read FCanModified write FCanModified;
- property RefreshDetailGrid: TRefreshDetailGridEvent read FRefreshDetailGrid write FRefreshDetailGrid;
- end;
- implementation
- uses
- PhaseData, ProjectData, BillsDm, UtilMethods, ProjectProperty, ZhAPI,
- BillsCompileDm, BillsMeasureDm, mPegFilter, Math;
- {$R *.dfm}
- { TZJJLData }
- constructor TZJJLData.Create(APhaseData: TObject);
- begin
- inherited Create(nil);
- FPhaseData := APhaseData;
- FOrgDataList := TList.Create;
- end;
- destructor TZJJLData.Destroy;
- begin
- ClearObjects(FOrgDataList);
- FOrgDataList.Free;
- inherited;
- end;
- function TZJJLData.GetMainBillsTree: TsdIDTree;
- begin
- with TProjectData(TPhaseData(FPhaseData).ProjectData) do
- Result := BillsMeasureData.BillsMeasureTree;
- end;
- procedure TZJJLData.Open(AConnection: TADOConnection);
- begin
- sdpZJJL.Connection := AConnection;
- sddZJJL.Open;
- sddZJJL.AddIndex('idxID', 'ID');
- sddZJJL.AddIndex('idxBillsID', 'BillsID');
- sdvZJJL.Open;
- sdpHistory.Connection := AConnection;
- sddHistory.Open;
- sddHistory.AddIndex('idxID', 'ID');
- sddHistory.AddIndex('idxHistory', 'BillsID;Type;FieldName');
- sddHistory.AddIndex('idxGatherHistory', 'BillsID;Type;B_Code;Name;Units;Price;FieldName');
- sdpZJJLDetail.Connection := AConnection;
- sddZJJLDetail.Open;
- sddZJJLDetail.AddIndex('idxID', 'ID');
- CheckZjjlVerison;
- end;
- procedure TZJJLData.Save;
- begin
- sddZJJL.Save;
- sddHistory.Save;
- sddZJJLDetail.Save;
- end;
- function TZJJLData.CheckLastXmj(AID: Integer): Boolean;
- var
- stnNode, stnChild: TsdIDTreeNode;
- begin
- stnNode := MainBillsTree.FindNode(AID);
- Result := stnNode.Rec.ValueByName('Code').AsString <> '';
- if not stnNode.HasChildren or not Result then Exit;
- stnChild := stnNode.FirstChild;
- Result := stnChild.Rec.ValueByName('B_Code').AsString <> '';
- end;
- procedure TZJJLData.AssignedCurData(ARec: TsdDataRecord; ADetailGrid: TZJGrid);
- var
- iRowIndex: Integer;
- begin
- ADetailGrid.OnCellTextChanged := nil;
- ADetailGrid.FixedRowCount := 0;
- ADetailGrid.FixedColCount := 0;
- ADetailGrid.ColCount := 1;
- ADetailGrid.RowCount := 11;
- ADetailGrid.DefaultColWidth := 300;
- for iRowIndex := 0 to ADetailGrid.RowCount - 1 do
- ADetailGrid[0, iRowIndex].Align := gaTopLeft;
- if not Assigned(ARec) then Exit;
- ADetailGrid.Cells[0, 0].Text := '变更令号:' + ARec.ValueByName('BGLCode').AsString;
- ADetailGrid.Cells[0, 1].Text := '部位:' + ARec.ValueByName('PegName').AsString;
- ADetailGrid.Cells[0, 2].Text := '起始桩号:' + ARec.ValueByName('BeginPeg').AsString;
- ADetailGrid.Cells[0, 3].Text := '终止桩号:' + ARec.ValueByName('EndPeg').AsString;
- ADetailGrid.Cells[0, 4].Text := '分部分项工程:' + ARec.ValueByName('FBFXName').AsString;
- ADetailGrid.Cells[0, 5].Text := '计量单元:' + ARec.ValueByName('UnitName').AsString;
- ADetailGrid.Cells[0, 6].Text := '图号:' + ARec.ValueByName('DrawingCode').AsString;
- ADetailGrid.Cells[0, 7].Text := '计算式说明:';
- ADetailGrid.Cells[0, 8].Text := ARec.ValueByName('FormulaMemo').AsString;
- ADetailGrid.Cells[0, 8].Align := gaTopLeft;
- ADetailGrid.RowHeights[8] := 57;
- ADetailGrid.Cells[0, 9].Text := '计算草图几何尺寸:';
- ADetailGrid.Cells[0, 10].Text := ARec.ValueByName('RelaFile').AsString;
- ADetailGrid.Cells[0, 10].Align := gaTopLeft;
- ADetailGrid.RowHeights[10] := 57;
- ADetailGrid.OnCellTextChanged := DetailGridCellTextChanged;
- end;
- procedure TZJJLData.GenerateAll;
- begin
- RestoreOrgData;
- FNewID := 1;
- DeleteAll;
- GenerateNode(MainBillsTree.FirstNode);
- TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := 1;
- end;
- procedure TZJJLData.GenerateNode(ANode: TsdIDTreeNode);
- begin
- if not Assigned(ANode) then Exit;
- if CheckLastXmj(ANode.ID) then
- GenerateLastXmj(ANode)
- else
- GenerateNode(ANode.FirstChild);
- GenerateNode(ANode.NextSibling);
- end;
- procedure TZJJLData.GenerateLastXmj(ANode: TsdIDTreeNode);
- begin
- if CheckMeasureExist(ANode) then
- GenerateZJJLNode(ANode, 0);
- end;
- function TZJJLData.CheckBGExist(ANode: TsdIDTreeNode): Boolean;
- function CheckBGLExist(AID: Integer): Boolean;
- var
- StageRec: TsdDataRecord;
- begin
- StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
- Result := Assigned(StageRec) and
- ((StageRec.ValueByName('QcBGLCode').AsString <> '')
- or (StageRec.ValueByName('PcBGLCode').AsString <> ''));
- end;
- var
- iChild: Integer;
- begin
- Result := False;
- if not Assigned(ANode) then Exit;
- if ANode.HasChildren then
- begin
- for iChild := 0 to ANode.ChildCount - 1 do
- begin
- Result := Result or CheckBGExist(ANode.ChildNodes[iChild]);
- if Result then Break;
- end;
- end
- else
- Result := CheckBGLExist(ANode.ID);
- end;
- procedure TZJJLData.DeleteAll;
- begin
- sddZJJL.DeleteAll;
- sddZJJLDetail.DeleteAll;
- end;
- procedure TZJJLData.RestoreOrgData;
- function CreateNodeData(ARec: TsdDataRecord): TZJJLNode;
- begin
- Result := TZJJLNode.Create;
- Result.FBillsID := ARec.ValueByName('BillsID').AsInteger;
- Result.FCode := ARec.ValueByName('Code').AsString;
- Result.FCertificateCode := ARec.ValueByName('CertificateCode').AsString;
- Result.FBillsCode := ARec.ValueByName('BillsCode').AsString;
- Result.FFormulaMemo := ARec.ValueByName('FormulaMemo').AsString;
- Result.FRelaFile := ARec.ValueByName('RelaFile').AsString;
- Result.FType := ARec.ValueByName('Type').AsInteger;
- end;
- var
- i: Integer;
- vRec: TsdDataRecord;
- begin
- FOrgDataList.Clear;
- for i := 0 to sddZJJL.RecordCount - 1 do
- begin
- vRec := sddZJJL.Records[i];
- FOrgDataList.Add(CreateNodeData(vRec));
- end;
- end;
- function TZJJLData.CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;
- function CheckStageCompleteData(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;
- var
- iChild: Integer;
- begin
- Result := False;
- if not Assigned(ANode) then Exit;
- if ANode.HasChildren then
- begin
- for iChild := 0 to ANode.ChildCount - 1 do
- begin
- Result := Result or CheckMeasureExist(ANode.ChildNodes[iChild]);
- if Result then Break;
- end;
- end
- else
- Result := CheckStageCompleteData(ANode.ID);
- end;
- procedure TZJJLData.DetailGridCellCanEdit(Sender: TObject;
- const ACoord: TPoint; var Allow: Boolean);
- begin
- Allow := ((ACoord.Y = 6) or (ACoord.Y = 8)) and
- not TPhaseData(FPhaseData).StageDataReadOnly;
- end;
- function TZJJLData.GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;
- var
- vPeg, vNode: TsdIDTreeNode;
- begin
- vNode := MainBillsTree.FindNode(ABillsID);
- vPeg := GetPegNode(vNode);
- Result.BGLCode := GetBGLCode(vNode);
- Result.PegName := GetFieldStrDef(vPeg, 'Name', '');
- Result.FBFXName := GetFBFXName(vNode, vPeg);
- Result.UnitName := GetFieldStrDef(vNode, 'Name', '');
- Result.DrawingCode := GetDrawingCode(vNode);
- end;
- procedure TZJJLData.DetailGridCellTextChanged(Sender: TObject; Col,
- Row: Integer);
- var
- Rec: TsdDataRecord;
- begin
- Rec := sdvZJJL.Current;
- if not Assigned(Rec) then Exit;
- if (Row = 8) then
- Rec.ValueByName('FormulaMemo').AsString := TZJGrid(Sender).Cells[Col, Row].Text
- else if (Row = 10) then
- Rec.ValueByName('RelaFile').AsString := TZJGrid(Sender).Cells[Col, Row].Text;
- end;
- procedure TZJJLData.GenerateAllByB_Code;
- begin
- RestoreOrgData;
- FNewID := 1;
- DeleteAll;
- GenerateNodeByB_Code(MainBillsTree.FirstNode);
- TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := 1;
- end;
- procedure TZJJLData.GenerateNodeByB_Code(ANode: TsdIDTreeNode);
- begin
- if not Assigned(ANode) then Exit;
- if ANode.HasChildren then
- GenerateNodeByB_Code(ANode.FirstChild)
- else
- GenerateLeafNode(ANode);
- GenerateNodeByB_Code(ANode.NextSibling);
- end;
- procedure TZJJLData.GenerateLeafNode(ANode: TsdIDTreeNode);
- begin
- if (ANode.Rec.ValueByName('B_Code').AsString <> '') and
- CheckLeafNodeMeasureExist(ANode.ID) then
- GenerateZJJLNode(ANode, 1);
- end;
- procedure TZJJLData.GenerateZJJLNode(ANode: TsdIDTreeNode;
- AType: Integer);
- function GetOrgZJJLNode(ABillsID: Integer): TZJJLNode;
- var
- iIndex: Integer;
- begin
- Result := nil;
- for iIndex := 0 to FOrgDataList.Count - 1 do
- // 7/30新增了一个“总量控制”模式,Type字段控制。真的是要疯掉了。
- if (TZJJLNode(FOrgDataList.Items[iIndex]).FBillsID = ABillsID)
- and (TZJJLNode(FOrgDataList.Items[iIndex]).FType = AType) then
- begin
- Result := TZJJLNode(FOrgDataList.Items[iIndex]);
- Break;
- end;
- end;
- function GetFieldValue(const AFieldName, ADefaultValue: string): string;
- var
- HistoryRec: TsdDataRecord;
- begin
- HistoryRec := sddHistory.FindKey('idxHistory', VarArrayOf([ANode.ID, AType, AFieldName]));
- if Assigned(HistoryRec) then
- Result := HistoryRec.ValueByName('FieldValue').AsString
- else
- Result := ADefaultValue;
- end;
- var
- ZJJLNode: TZJJLNode;
- vInfoRec: TZJJLInfoRec;
- Rec: TsdDataRecord;
- begin
- Rec := sddZJJL.Add;
- Rec.ValueByName('ID').AsInteger := FNewID;
- Rec.ValueByName('BillsID').AsInteger := ANode.ID;
- Rec.ValueByName('Type').AsInteger := AType;
- if AType = Ord(ztFx) then
- Rec.ValueByName('BillsCode').AsString := ANode.Rec.ValueByName('Code').AsString
- else if AType = Ord(ztGcl) then
- Rec.ValueByName('BillsCode').AsString := ANode.Rec.ValueByName('B_Code').AsString;
- 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', '');
- vInfoRec := GetInfoRec_2(ANode.ID, AType);
- Rec.ValueByName('BGLCode').AsString := GetFieldValue('BGLCode', vInfoRec.BGLCode);
- Rec.ValueByName('PegName').AsString := GetFieldValue('PegName', vInfoRec.PegName);
- Rec.ValueByName('BeginPeg').AsString := GetFieldValue('BeginPeg', vInfoRec.BeginPeg);
- Rec.ValueByName('EndPeg').AsString := GetFieldValue('EndPeg', vInfoRec.EndPeg);
- Rec.ValueByName('FBFXName').AsString := GetFieldValue('FBFXName', vInfoRec.FBFXName);
- Rec.ValueByName('UnitName').AsString := GetFieldValue('UnitName', vInfoRec.UnitName);
- Rec.ValueByName('DrawingCode').AsString := GetFieldValue('DrawingCode', vInfoRec.DrawingCode);
- Rec := sddZJJLDetail.Add;
- Rec.ValueByName('ID').AsInteger := FNewID;
- Rec.ValueByName('BillsID').AsInteger := ANode.ID;
- Inc(FNewID);
- end;
- function TZJJLData.GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
- var
- vNode: TsdIDTreeNode;
- begin
- vNode := MainBillsTree.FindNode(ABillsID);
- Result.BGLCode := GetBGLCode(vNode);
- if Assigned(vNode.Parent) then
- Result.PegName := vNode.Parent.Rec.ValueByName('Name').AsString;
- Result.FBFXName := '';
- Result.UnitName := vNode.Rec.ValueByName('Name').AsString;
- Result.DrawingCode := GetDrawingCode(vNode);
- end;
- function TZJJLData.GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;
- begin
- if AType = 0 then
- Result := GetInfoRecByCode(ABillsID)
- else if AType = 1 then
- Result := GetInfoRecByB_Code(ABillsID);
- end;
- procedure TZJJLData.LocateBills;
- var
- Rec: TsdDataRecord;
- begin
- with TProjectData(TPhaseData(FPhaseData).ProjectData) do
- begin
- Rec := BillsData.sddBills.FindKey('idxID', sdvZJJL.Current.ValueByName('BillsID').AsInteger);
- BillsMeasureData.sdvBillsMeasure.LocateInControl(Rec);
- end;
- end;
- function TZJJLData.GetDrawingCode(ANode: TsdIDTreeNode): string;
- var
- vNode: TBillsIDTreeNode;
- begin
- Result := '';
- vNode := TBillsIDTreeNode(ANode);
- while (Result = '') and Assigned(vNode) do
- begin
- if Assigned(vNode.Rec) then
- Result := vNode.Rec.DrawingCode.AsString;
- vNode := TBillsIDTreeNode(vNode.Parent);
- end;
- end;
- procedure TZJJLData.CheckZjjlVerison;
- procedure LoadVersion0Info;
- var
- i: Integer;
- Rec: TsdDataRecord;
- ZJJLInfoRec: TZJJLInfoRec;
- begin
- for i := 0 to sddZJJL.RecordCount - 1 do
- begin
- Rec := sddZJJL.Records[i];
- ZJJLInfoRec := GetInfoRec(Rec.ValueByName('BillsID').AsInteger, Rec.ValueByName('Type').AsInteger);
- Rec.ValueByName('BGLCode').AsString := ZJJLInfoRec.BGLCode;
- Rec.ValueByName('PegName').AsString := ZJJLInfoRec.PegName;
- Rec.ValueByName('FBFXName').AsString := ZJJLInfoRec.FBFXName;
- Rec.ValueByName('UnitName').AsString := ZJJLInfoRec.UnitName;
- Rec.ValueByName('DrawingCode').AsString := ZJJLInfoRec.DrawingCode;
- end;
- end;
- procedure LoadVersion0History;
- var
- i, j, iNewID: Integer;
- Rec: TsdDataRecord;
- begin
- for i := 0 to sddZJJL.RecordCount - 1 do
- begin
- Rec := sddZJJL.Records[i];
- if Rec.ValueByName('CertificateCode').AsString <> '' then
- SetHistory('CertificateCode', Rec.ValueByName('CertificateCode').AsString, Rec);
- if Rec.ValueByName('FormulaMemo').AsString <> '' then
- SetHistory('FormulaMemo', Rec.ValueByName('FormulaMemo').AsString, Rec);
- if Rec.ValueByName('RelaFile').AsString <> '' then
- SetHistory('RelaFile', Rec.ValueByName('RelaFile').AsString, Rec);
- end;
- end;
- begin
- if TPhaseData(PhaseData).PhaseProperty.ZjjlVersion = 0 then
- begin
- TPhaseData(PhaseData).PhaseProperty.ZJJLPreText := TProjectData(TPhaseData(PhaseData).ProjectData).ProjProperties.ZJJLPreText;
- LoadVersion0Info;
- LoadVersion0History;
- end;
- end;
- function TZJJLData.GetInfoRec_2(ABillsID, AType: Integer): TZJJLInfoRec;
- begin
- if AType = 0 then
- Result := GetInfoRecByCode_2(ABillsID)
- else if AType = 1 then
- Result := GetInfoRecByB_Code_2(ABillsID);
- end;
- function TZJJLData.GetInfoRecByB_Code_2(ABillsID: Integer): TZJJLInfoRec;
- var
- vNode: TsdIDTreeNode;
- sPeg: string;
- vPegFilter: TPegStrFilter;
- begin
- vNode := MainBillsTree.FindNode(ABillsID);
- sPeg := GetPegName(vNode);
- Result.BGLCode := GetBGLCode(vNode);
- if Assigned(vNode.Parent) then
- Result.PegName := vNode.Parent.Rec.ValueByName('Name').AsString;
- if sPeg <> '' then
- begin
- vPegFilter := TPegStrFilter.Create;
- vPegFilter.PegStr := sPeg;
- Result.BeginPeg := vPegFilter.BeginPeg;
- Result.EndPeg := vPegFilter.EndPeg;
- vPegFilter.Free;
- end;
- Result.UnitName := vNode.Rec.ValueByName('Name').AsString;
- Result.DrawingCode := GetDrawingCode(vNode);
- end;
- function TZJJLData.GetInfoRecByCode_2(ABillsID: Integer): TZJJLInfoRec;
- var
- vPeg, vNode: TsdIDTreeNode;
- vPegFilter: TPegStrFilter;
- begin
- vNode := MainBillsTree.FindNode(ABillsID);
- vPeg := GetPegNode(vNode);
- Result.BGLCode := GetBGLCode(vNode);
- Result.PegName := GetFieldStrDef(vPeg, 'Name', '');
- if Result.PegName <> '' then
- begin
- vPegFilter := TPegStrFilter.Create;
- vPegFilter.PegStr := Result.PegName;
- Result.BeginPeg := vPegFilter.BeginPeg;
- Result.EndPeg := vPegFilter.EndPeg;
- vPegFilter.Free;
- end;
- Result.FBFXName := GetFBFXName(vNode, vPeg);
- Result.UnitName := GetFieldStrDef(vNode, 'Name', '');
- Result.DrawingCode := GetDrawingCode(vNode);
- end;
- function TZJJLData.GetBGLCode(ANode: TsdIDTreeNode): string;
- begin
- with TProjectData(TPhaseData(FPhaseData).ProjectData) do
- Result := BillsMeasureData.GatherRelaBGL(ANode);
- end;
- function TZJJLData.GetPegName(ANode: TsdIDTreeNode): string;
- var
- vPeg: TsdIDTreeNode;
- begin
- vPeg := GetPegNode(ANode);
- Result := GetFieldStrDef(vPeg, 'Name', '');
- end;
- function TZJJLData.GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName,
- ADef: string): string;
- begin
- if Assigned(ANode) then
- Result := ANode.Rec.ValueByName(AFieldName).AsString
- else
- Result := '';
- end;
- function TZJJLData.GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
- begin
- Result := nil;
- if not Assigned(ANode) then Exit;
- if CheckPeg(ANode.Rec.ValueByName('Name').AsString) then
- Result := ANode
- else
- Result := GetPegNode(ANode.Parent);
- end;
- function TZJJLData.GetFBFXName(ANode, APegNode: TsdIDTreeNode): string;
- var
- vCurNode: TsdIDTreeNode;
- begin
- Result := '';
- if not Assigned(ANode) then Exit;
- // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)
- if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then
- begin
- // 取树结构的第三、四层节点的名称
- Result := GetNameByLevel(ANode, 2);
- if (Result <> '') and (GetNameByLevel(ANode, 3) <> '') then
- Result := Result + ',';
- Result := Result + GetNameByLevel(ANode, 3);
- end
- // 否则,合并[桩号节点的子节点]至[计量单元节点的父节点]的名称
- else
- begin
- vCurNode := ANode.Parent;
- // 转化为判断层次,层次大于[桩号节点的子节点]的层次
- while vCurNode.Level > APegNode.Level do
- begin
- Result := vCurNode.Rec.ValueByName('Name').AsString + ',' + Result;
- vCurNode := vCurNode.Parent;
- end;
- end;
- end;
- function TZJJLData.GetNameByLevel(ANode: TsdIDTreeNode;
- ALevel: Integer): string;
- begin
- Result := '';
- if not Assigned(ANode) then Exit;
- if ANode.Level = ALevel then
- Result := ANode.Rec.ValueByName('Name').AsString
- else if ANode.Level > ALevel then
- Result := GetNameByLevel(ANode.Parent, ALevel);
- end;
- procedure TZJJLData.SetHistory(const AFieldName, AValue: string;
- AZJJL_Rec: TsdDataRecord);
- var
- HistoryRec: TsdDataRecord;
- begin
- if AZJJL_Rec.ValueByName('Type').AsInteger <> Integer(ztGclGather) then
- HistoryRec := sddHistory.FindKey('idxHistory', VarArrayOf([AZJJL_Rec.ValueByName('BillsID').AsInteger,
- AZJJL_Rec.ValueByName('Type').AsInteger, AFieldName]))
- else
- HistoryRec := sddHistory.FindKey('idxGatherHistory', VarArrayOf([AZJJL_Rec.ValueByName('GatherBillsID').AsInteger,
- AZJJL_Rec.ValueByName('Type').AsInteger, AZJJL_Rec.ValueByName('B_Code').AsString,
- AZJJL_Rec.ValueByName('Name').AsString, AZJJL_Rec.ValueByName('Units').AsString,
- AZJJL_Rec.ValueByName('Price').AsFloat, AFieldName]));
- if not Assigned(HistoryRec) then
- begin
- HistoryRec := sddHistory.Add;
- HistoryRec.ValueByName('ID').AsInteger := GetNewHistoryID;
- if AZJJL_Rec.ValueByName('Type').AsInteger <> Integer(ztGclGather) then
- HistoryRec.ValueByName('BillsID').AsInteger := AZJJL_Rec.ValueByName('BillsID').AsInteger
- else
- HistoryRec.ValueByName('BillsID').AsInteger := AZJJL_Rec.ValueByName('GatherBillsID').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;
- function TZJJLData.GetNewHistoryID: Integer;
- var
- idx: TsdIndex;
- begin
- idx := sddHistory.FindIndex('idxID');
- if idx.RecordCount = 0 then
- Result := 1
- else
- Result := idx.Records[idx.RecordCount - 1].ValueByName('ID').AsInteger + 1;
- end;
- procedure TZJJLData.sdvZJJLBeforeValueChange(AValue: TsdValue;
- const NewValue: Variant; var Allow: Boolean);
- function CheckFieldNeedHistory(const AFieldName: string): Boolean;
- begin
- Result := SameText(AFieldName, 'Code') or
- SameText(AFieldName, 'CertificateCode') or
- SameText(AFieldName, 'BGLCode') or
- SameText(AFieldName, 'PegName') or
- SameText(AFieldName, 'BeginPeg') or
- SameText(AFieldName, 'EndPeg') or
- SameText(AFieldName, 'FBFXName') or
- SameText(AFieldName, 'UnitName') or
- SameText(AFieldName, 'DrawingCode') or
- SameText(AFieldName, 'FormulaMemo') or
- SameText(AFieldName, 'RelaFile');
- end;
- var
- sNewValue: string;
- begin
- if CheckFieldNeedHistory(AValue.FieldName) and not TPhaseData(FPhaseData).StageDataReadOnly then
- begin
- sNewValue := VarToStrDef(NewValue, '');
- if sNewValue <> AValue.AsString then
- SetHistory(AValue.FieldName, sNewValue, AValue.Owner);
- end;
- end;
- procedure TZJJLData.sdvZJJLAfterDeleteRecord(ARecord: TsdDataRecord);
- begin
- if ARecord.ValueByName('Type').AsInteger <> Integer(ztGclGather) then
- DeleteHistory(ARecord.ValueByName('BillsID').AsInteger, ARecord.ValueByName('Type').AsInteger)
- else
- DeleteGatherHistory(ARecord);
- end;
- procedure TZJJLData.DeleteHistory(ABillsID, AType: Integer);
- var
- i: Integer;
- Rec: TsdDataRecord;
- begin
- i := 0;
- while (i < sddHistory.RecordCount) do
- begin
- Rec := sddHistory.Records[i];
- if (ABillsID = Rec.ValueByName('BillsID').AsInteger) and
- (AType = Rec.ValueByName('Type').AsInteger) then
- sddHistory.Remove(Rec)
- else
- Inc(i);
- 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('idxGatherHistory', VarArrayOf([AZJJL.GatherNode.ID, Integer(ztGclGather), AZJJL.B_Code, AZJJL.Name, AZJJL.Units, AZJJL.Price, 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('Type').AsInteger := Integer(ztGclGather);
- 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;
- function TZJJLData.FindZJJLRecord(ABillsID: Integer): TsdDataRecord;
- var
- ADetailRec: TsdDataRecord;
- begin
- if sddZJJLDetail.RecordCount > 0 then
- begin
- ADetailRec := sddZJJLDetail.Locate('BillsID', ABillsID);
- if Assigned(ADetailRec) then
- Result := sddZJJL.FindKey('idxID', ADetailRec.ValueByName('ID').AsInteger)
- else
- Result := nil;
- end
- else
- Result := sddZJJL.Locate('BillsID', ABillsID);
- end;
- procedure TZJJLData.DeleteGatherHistory(ARecord: TsdDataRecord);
- var
- i: Integer;
- Rec: TsdDataRecord;
- begin
- i := 0;
- while (i < sddHistory.RecordCount) do
- begin
- Rec := sddHistory.Records[i];
- if (ARecord.ValueByName('GatherBillsID').AsInteger = Rec.ValueByName('BillsID').AsInteger) and
- (ARecord.ValueByName('Type').AsInteger = Rec.ValueByName('Type').AsInteger) and
- (ARecord.ValueByName('B_Code').AsString = Rec.ValueByName('B_Code').AsString) and
- (ARecord.ValueByName('Name').AsString = Rec.ValueByName('Name').AsString) and
- (ARecord.ValueByName('Units').AsString = Rec.ValueByName('Units').AsString) and
- (Abs(ARecord.ValueByName('Price').AsFloat - Rec.ValueByName('Price').AsFloat) < 0.00001) then
- sddHistory.Remove(Rec)
- else
- Inc(i);
- end;
- end;
- procedure TZJJLData.sdvZJJLCurrentChanged(ARecord: TsdDataRecord);
- begin
- if Assigned(FRefreshDetailGrid) then
- FRefreshDetailGrid;
- end;
- function TZJJLData.GetZJJLCalcData(ARec: TsdDataRecord;
- const AFileName: string): Double;
- var
- vIdx: TsdIndex;
- iBegin, iEnd, i: Integer;
- vRec, vStageRec: TsdDataRecord;
- begin
- Result := 0;
- vIdx := sddZJJLDetail.FindIndex('idxID');
- iBegin := vIdx.FindKeyIndex(ARec.ValueByName('ID').AsInteger);
- iEnd := vIdx.FindKeyLastIndex(ARec.ValueByName('ID').AsInteger);
- if iBegin <> -1 then
- begin
- for i := iBegin to iEnd do
- begin
- vRec := vIdx.Records[i];
- vStageRec := TPhaseData(FPhaseData).StageData.StageRecord(vRec.ValueByName('BillsID').AsInteger);
- if Assigned(vStageRec) then
- Result := QuantityRoundTo(Result + vStageRec.ValueByName(AFileName).AsFloat);
- end;
- end;
- end;
- end.
|