ZJJLDm.pas 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. unit ZJJLDm;
  2. interface
  3. uses
  4. ZjGrid,
  5. SysUtils, Classes, DB, DBClient, ADODB, sdIDTree, sdDB, Provider,
  6. Windows, BillsTree, sdProvider, Variants;
  7. type
  8. TZJJLType = (ztFx, ztGcl);
  9. TZJJLNode = class
  10. private
  11. FBillsID: Integer;
  12. FCode: string;
  13. FCertificateCode: string;
  14. FBillsCode: string;
  15. FFormulaMemo: string;
  16. FRelaFile: string;
  17. FType: Integer;
  18. end;
  19. TZJJLInfoRec = Record
  20. FBFXName: string;
  21. PegName: string;
  22. BeginPeg: string;
  23. EndPeg: string;
  24. BGLCode: string;
  25. DrawingCode: string;
  26. UnitName: string;
  27. end;
  28. TZJJLData = class(TDataModule)
  29. sdpZJJL: TsdADOProvider;
  30. sddZJJL: TsdDataSet;
  31. sdvZJJL: TsdDataView;
  32. sdpHistory: TsdADOProvider;
  33. sddHistory: TsdDataSet;
  34. procedure sdvZJJLBeforeValueChange(AValue: TsdValue;
  35. const NewValue: Variant; var Allow: Boolean);
  36. private
  37. FPhaseData: TObject;
  38. FCanModified: Boolean;
  39. FNewID: Integer;
  40. FOrgDataList: TList;
  41. procedure GenerateZJJLNode(ANode: TsdIDTreeNode; AType: Integer);
  42. function CheckLastXmj(AID: Integer): Boolean;
  43. function CheckBGExist(ANode: TsdIDTreeNode): Boolean;
  44. function CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;
  45. procedure GenerateLastXmj(ANode: TsdIDTreeNode);
  46. procedure GenerateNode(ANode: TsdIDTreeNode);
  47. procedure GenerateLeafNode(ANode: TsdIDTreeNode);
  48. procedure GenerateNodeByB_Code(ANode: TsdIDTreeNode);
  49. procedure DeleteAll;
  50. procedure RestoreOrgData;
  51. procedure DetailGridCellCanEdit(Sender: TObject; const ACoord: TPoint;
  52. var Allow: Boolean);
  53. procedure DetailGridCellTextChanged(Sender: TObject; Col, Row: Integer);
  54. function GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName, ADef: string): string;
  55. function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
  56. function GetBGLCode(ANode: TsdIDTreeNode): string;
  57. // 取树结构的第ALevel层节点的名称(level从0开始)
  58. function GetNameByLevel(ANode: TsdIDTreeNode; ALevel: Integer): string;
  59. function GetFBFXName(ANode, APegNode: TsdIDTreeNode): string;
  60. function GetPegName(ANode: TsdIDTreeNode): string;
  61. function GetInfoRecByCode_2(ABillsID: Integer): TZJJLInfoRec;
  62. function GetInfoRecByB_Code_2(ABillsID: Integer): TZJJLInfoRec;
  63. function GetInfoRec_2(ABillsID, AType: Integer): TZJJLInfoRec;
  64. function GetNewHistoryID: Integer;
  65. procedure SetHistory(const AFieldName, AValue: string; AZJJL_Rec: TsdDataRecord);
  66. // 向父项检测,直至提取到图册号为止
  67. function GetDrawingCode(ANode: TsdIDTreeNode): string;
  68. procedure CheckZjjlVerison;
  69. function GetMainBillsTree: TsdIDTree;
  70. public
  71. constructor Create(APhaseData: TObject);
  72. destructor Destroy; override;
  73. procedure Open(AConnection: TADOConnection);
  74. procedure Save;
  75. procedure GenerateAll;
  76. procedure GenerateAllByB_Code;
  77. procedure AssignedCurData(ARec: TsdDataRecord; ADetailGrid: TZJGrid);
  78. function GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;
  79. function GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
  80. function GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;
  81. procedure LocateBills;
  82. property PhaseData: TObject read FPhaseData;
  83. property MainBillsTree: TsdIDTree read GetMainBillsTree;
  84. property CanModified: Boolean read FCanModified write FCanModified;
  85. end;
  86. implementation
  87. uses
  88. PhaseData, ProjectData, BillsDm, UtilMethods, ProjectProperty, ZhAPI,
  89. BillsCompileDm, BillsMeasureDm, mPegFilter;
  90. {$R *.dfm}
  91. { TZJJLData }
  92. constructor TZJJLData.Create(APhaseData: TObject);
  93. begin
  94. inherited Create(nil);
  95. FPhaseData := APhaseData;
  96. FOrgDataList := TList.Create;
  97. end;
  98. destructor TZJJLData.Destroy;
  99. begin
  100. ClearObjects(FOrgDataList);
  101. FOrgDataList.Free;
  102. inherited;
  103. end;
  104. function TZJJLData.GetMainBillsTree: TsdIDTree;
  105. begin
  106. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  107. Result := BillsMeasureData.BillsMeasureTree;
  108. end;
  109. procedure TZJJLData.Open(AConnection: TADOConnection);
  110. begin
  111. sdpZJJL.Connection := AConnection;
  112. sddZJJL.Open;
  113. sddZJJL.AddIndex('idxID', 'ID');
  114. sddZJJL.AddIndex('idxBillsID', 'BillsID');
  115. sdvZJJL.Open;
  116. sdpHistory.Connection := AConnection;
  117. sddHistory.Open;
  118. sddHistory.AddIndex('idxID', 'ID');
  119. sddHistory.AddIndex('idxHistory', 'BillsID;Type;FieldName');
  120. CheckZjjlVerison;
  121. end;
  122. procedure TZJJLData.Save;
  123. begin
  124. sddZJJL.Save;
  125. sddHistory.Save;
  126. end;
  127. function TZJJLData.CheckLastXmj(AID: Integer): Boolean;
  128. var
  129. stnNode, stnChild: TsdIDTreeNode;
  130. begin
  131. stnNode := MainBillsTree.FindNode(AID);
  132. Result := stnNode.Rec.ValueByName('Code').AsString <> '';
  133. if not stnNode.HasChildren or not Result then Exit;
  134. stnChild := stnNode.FirstChild;
  135. Result := stnChild.Rec.ValueByName('B_Code').AsString <> '';
  136. end;
  137. procedure TZJJLData.AssignedCurData(ARec: TsdDataRecord; ADetailGrid: TZJGrid);
  138. var
  139. iRowIndex: Integer;
  140. begin
  141. ADetailGrid.OnCellTextChanged := nil;
  142. ADetailGrid.FixedRowCount := 0;
  143. ADetailGrid.FixedColCount := 0;
  144. ADetailGrid.ColCount := 1;
  145. ADetailGrid.RowCount := 11;
  146. ADetailGrid.DefaultColWidth := 300;
  147. for iRowIndex := 0 to ADetailGrid.RowCount - 1 do
  148. ADetailGrid[0, iRowIndex].Align := gaTopLeft;
  149. if not Assigned(ARec) then Exit;
  150. ADetailGrid.Cells[0, 0].Text := '变更令号:' + ARec.ValueByName('BGLCode').AsString;
  151. ADetailGrid.Cells[0, 1].Text := '部位:' + ARec.ValueByName('PegName').AsString;
  152. ADetailGrid.Cells[0, 2].Text := '起始桩号:' + ARec.ValueByName('BeginPeg').AsString;
  153. ADetailGrid.Cells[0, 3].Text := '终止桩号:' + ARec.ValueByName('EndPeg').AsString;
  154. ADetailGrid.Cells[0, 4].Text := '分部分项工程:' + ARec.ValueByName('FBFXName').AsString;
  155. ADetailGrid.Cells[0, 5].Text := '计量单元:' + ARec.ValueByName('UnitName').AsString;
  156. ADetailGrid.Cells[0, 6].Text := '图号:' + ARec.ValueByName('DrawingCode').AsString;
  157. ADetailGrid.Cells[0, 7].Text := '计算式说明:';
  158. ADetailGrid.Cells[0, 8].Text := ARec.ValueByName('FormulaMemo').AsString;
  159. ADetailGrid.Cells[0, 8].Align := gaTopLeft;
  160. ADetailGrid.RowHeights[8] := 57;
  161. ADetailGrid.Cells[0, 9].Text := '计算草图几何尺寸:';
  162. ADetailGrid.Cells[0, 10].Text := ARec.ValueByName('RelaFile').AsString;
  163. ADetailGrid.Cells[0, 10].Align := gaTopLeft;
  164. ADetailGrid.RowHeights[10] := 57;
  165. ADetailGrid.OnCellTextChanged := DetailGridCellTextChanged;
  166. end;
  167. procedure TZJJLData.GenerateAll;
  168. begin
  169. RestoreOrgData;
  170. FNewID := 1;
  171. DeleteAll;
  172. GenerateNode(MainBillsTree.FirstNode);
  173. TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := 1;
  174. end;
  175. procedure TZJJLData.GenerateNode(ANode: TsdIDTreeNode);
  176. begin
  177. if not Assigned(ANode) then Exit;
  178. if CheckLastXmj(ANode.ID) then
  179. GenerateLastXmj(ANode)
  180. else
  181. GenerateNode(ANode.FirstChild);
  182. GenerateNode(ANode.NextSibling);
  183. end;
  184. procedure TZJJLData.GenerateLastXmj(ANode: TsdIDTreeNode);
  185. begin
  186. if CheckMeasureExist(ANode) then
  187. GenerateZJJLNode(ANode, 0);
  188. end;
  189. function TZJJLData.CheckBGExist(ANode: TsdIDTreeNode): Boolean;
  190. function CheckBGLExist(AID: Integer): Boolean;
  191. var
  192. StageRec: TsdDataRecord;
  193. begin
  194. StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
  195. Result := Assigned(StageRec) and
  196. ((StageRec.ValueByName('QcBGLCode').AsString <> '')
  197. or (StageRec.ValueByName('PcBGLCode').AsString <> ''));
  198. end;
  199. var
  200. iChild: Integer;
  201. begin
  202. Result := False;
  203. if not Assigned(ANode) then Exit;
  204. if ANode.HasChildren then
  205. begin
  206. for iChild := 0 to ANode.ChildCount - 1 do
  207. begin
  208. Result := Result or CheckBGExist(ANode.ChildNodes[iChild]);
  209. if Result then Break;
  210. end;
  211. end
  212. else
  213. Result := CheckBGLExist(ANode.ID);
  214. end;
  215. procedure TZJJLData.DeleteAll;
  216. begin
  217. sddZJJL.DeleteAll;
  218. end;
  219. procedure TZJJLData.RestoreOrgData;
  220. function CreateNodeData(ARec: TsdDataRecord): TZJJLNode;
  221. begin
  222. Result := TZJJLNode.Create;
  223. Result.FBillsID := ARec.ValueByName('BillsID').AsInteger;
  224. Result.FCode := ARec.ValueByName('Code').AsString;
  225. Result.FCertificateCode := ARec.ValueByName('CertificateCode').AsString;
  226. Result.FBillsCode := ARec.ValueByName('BillsCode').AsString;
  227. Result.FFormulaMemo := ARec.ValueByName('FormulaMemo').AsString;
  228. Result.FRelaFile := ARec.ValueByName('RelaFile').AsString;
  229. Result.FType := ARec.ValueByName('Type').AsInteger;
  230. end;
  231. var
  232. i: Integer;
  233. vRec: TsdDataRecord;
  234. begin
  235. FOrgDataList.Clear;
  236. for i := 0 to sddZJJL.RecordCount - 1 do
  237. begin
  238. vRec := sddZJJL.Records[i];
  239. FOrgDataList.Add(CreateNodeData(vRec));
  240. end;
  241. end;
  242. function TZJJLData.CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;
  243. function CheckStageCompleteData(AID: Integer): Boolean;
  244. var
  245. StageRec: TsdDataRecord;
  246. begin
  247. StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
  248. Result := Assigned(StageRec) and
  249. ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)
  250. or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));
  251. end;
  252. var
  253. iChild: Integer;
  254. begin
  255. Result := False;
  256. if not Assigned(ANode) then Exit;
  257. if ANode.HasChildren then
  258. begin
  259. for iChild := 0 to ANode.ChildCount - 1 do
  260. begin
  261. Result := Result or CheckMeasureExist(ANode.ChildNodes[iChild]);
  262. if Result then Break;
  263. end;
  264. end
  265. else
  266. Result := CheckStageCompleteData(ANode.ID);
  267. end;
  268. procedure TZJJLData.DetailGridCellCanEdit(Sender: TObject;
  269. const ACoord: TPoint; var Allow: Boolean);
  270. begin
  271. Allow := ((ACoord.Y = 6) or (ACoord.Y = 8)) and
  272. not TPhaseData(FPhaseData).StageDataReadOnly;
  273. end;
  274. function TZJJLData.GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;
  275. var
  276. vPeg, vNode: TsdIDTreeNode;
  277. begin
  278. vNode := MainBillsTree.FindNode(ABillsID);
  279. vPeg := GetPegNode(vNode);
  280. Result.BGLCode := GetBGLCode(vNode);
  281. Result.PegName := GetFieldStrDef(vPeg, 'Name', '');
  282. Result.FBFXName := GetFBFXName(vNode, vPeg);
  283. Result.UnitName := GetFieldStrDef(vNode, 'Name', '');
  284. Result.DrawingCode := GetDrawingCode(vNode);
  285. end;
  286. procedure TZJJLData.DetailGridCellTextChanged(Sender: TObject; Col,
  287. Row: Integer);
  288. var
  289. Rec: TsdDataRecord;
  290. begin
  291. Rec := sdvZJJL.Current;
  292. if not Assigned(Rec) then Exit;
  293. if (Row = 8) then
  294. Rec.ValueByName('FormulaMemo').AsString := TZJGrid(Sender).Cells[Col, Row].Text
  295. else if (Row = 10) then
  296. Rec.ValueByName('RelaFile').AsString := TZJGrid(Sender).Cells[Col, Row].Text;
  297. end;
  298. procedure TZJJLData.GenerateAllByB_Code;
  299. begin
  300. RestoreOrgData;
  301. FNewID := 1;
  302. DeleteAll;
  303. GenerateNodeByB_Code(MainBillsTree.FirstNode);
  304. TPhaseData(FPhaseData).PhaseProperty.ZjjlVersion := 1;
  305. end;
  306. procedure TZJJLData.GenerateNodeByB_Code(ANode: TsdIDTreeNode);
  307. begin
  308. if not Assigned(ANode) then Exit;
  309. if ANode.HasChildren then
  310. GenerateNodeByB_Code(ANode.FirstChild)
  311. else
  312. GenerateLeafNode(ANode);
  313. GenerateNodeByB_Code(ANode.NextSibling);
  314. end;
  315. procedure TZJJLData.GenerateLeafNode(ANode: TsdIDTreeNode);
  316. function CheckMeasureExist(AID: Integer): Boolean;
  317. var
  318. StageRec: TsdDataRecord;
  319. begin
  320. StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
  321. Result := Assigned(StageRec) and
  322. ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)
  323. or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));
  324. end;
  325. begin
  326. if (ANode.Rec.ValueByName('B_Code').AsString <> '') and
  327. CheckMeasureExist(ANode.ID) then
  328. GenerateZJJLNode(ANode, 1);
  329. end;
  330. procedure TZJJLData.GenerateZJJLNode(ANode: TsdIDTreeNode;
  331. AType: Integer);
  332. function GetNewCode: string;
  333. begin
  334. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  335. begin
  336. Result := ProjProperties.ZJJLPreText;
  337. if (Result <> '') and (Result[Length(Result)] <> '-') then
  338. Result := Result + '-';
  339. Result := Result + Format('%d-%d', [PhaseIndex, FNewID]);
  340. end;
  341. end;
  342. function GetOrgZJJLNode(ABillsID: Integer): TZJJLNode;
  343. var
  344. iIndex: Integer;
  345. begin
  346. Result := nil;
  347. for iIndex := 0 to FOrgDataList.Count - 1 do
  348. // 7/30新增了一个“总量控制”模式,Type字段控制。真的是要疯掉了。
  349. if (TZJJLNode(FOrgDataList.Items[iIndex]).FBillsID = ABillsID)
  350. and (TZJJLNode(FOrgDataList.Items[iIndex]).FType = AType) then
  351. begin
  352. Result := TZJJLNode(FOrgDataList.Items[iIndex]);
  353. Break;
  354. end;
  355. end;
  356. function GetFieldValue(const AFieldName, ADefaultValue: string): string;
  357. var
  358. HistoryRec: TsdDataRecord;
  359. begin
  360. HistoryRec := sddHistory.FindKey('idxHistory', VarArrayOf([ANode.ID, AType, AFieldName]));
  361. if Assigned(HistoryRec) then
  362. Result := HistoryRec.ValueByName('FieldValue').AsString
  363. else
  364. Result := ADefaultValue;
  365. end;
  366. var
  367. ZJJLNode: TZJJLNode;
  368. vInfoRec: TZJJLInfoRec;
  369. Rec: TsdDataRecord;
  370. begin
  371. Rec := sddZJJL.Add;
  372. Rec.ValueByName('ID').AsInteger := FNewID;
  373. Rec.ValueByName('BillsID').AsInteger := ANode.ID;
  374. Rec.ValueByName('Type').AsInteger := AType;
  375. if AType = Ord(ztFx) then
  376. Rec.ValueByName('BillsCode').AsString := ANode.Rec.ValueByName('Code').AsString
  377. else if AType = Ord(ztGcl) then
  378. Rec.ValueByName('BillsCode').AsString := ANode.Rec.ValueByName('B_Code').AsString;
  379. Rec.ValueByName('Code').AsString := GetFieldValue('Code', GetNewCode);
  380. Rec.ValueByName('CertificateCode').AsString := GetFieldValue('CertificateCode', '');
  381. Rec.ValueByName('FormulaMemo').AsString := GetFieldValue('FormulaMemo', '');
  382. Rec.ValueByName('RelaFile').AsString := GetFieldValue('RelaFile', '');
  383. vInfoRec := GetInfoRec_2(ANode.ID, AType);
  384. Rec.ValueByName('BGLCode').AsString := GetFieldValue('BGLCode', vInfoRec.BGLCode);
  385. Rec.ValueByName('PegName').AsString := GetFieldValue('PegName', vInfoRec.PegName);
  386. Rec.ValueByName('BeginPeg').AsString := GetFieldValue('BeginPeg', vInfoRec.BeginPeg);
  387. Rec.ValueByName('EndPeg').AsString := GetFieldValue('EndPeg', vInfoRec.EndPeg);
  388. Rec.ValueByName('FBFXName').AsString := GetFieldValue('FBFXName', vInfoRec.FBFXName);
  389. Rec.ValueByName('UnitName').AsString := GetFieldValue('UnitName', vInfoRec.UnitName);
  390. Rec.ValueByName('DrawingCode').AsString := GetFieldValue('DrawingCode', vInfoRec.DrawingCode);
  391. Inc(FNewID);
  392. end;
  393. function TZJJLData.GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
  394. var
  395. vNode: TsdIDTreeNode;
  396. begin
  397. vNode := MainBillsTree.FindNode(ABillsID);
  398. Result.BGLCode := GetBGLCode(vNode);
  399. if Assigned(vNode.Parent) then
  400. Result.PegName := vNode.Parent.Rec.ValueByName('Name').AsString;
  401. Result.FBFXName := '';
  402. Result.UnitName := vNode.Rec.ValueByName('Name').AsString;
  403. Result.DrawingCode := GetDrawingCode(vNode);
  404. end;
  405. function TZJJLData.GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;
  406. begin
  407. if AType = 0 then
  408. Result := GetInfoRecByCode(ABillsID)
  409. else if AType = 1 then
  410. Result := GetInfoRecByB_Code(ABillsID);
  411. end;
  412. procedure TZJJLData.LocateBills;
  413. var
  414. Rec: TsdDataRecord;
  415. begin
  416. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  417. begin
  418. Rec := BillsData.sddBills.FindKey('idxID', sdvZJJL.Current.ValueByName('BillsID').AsInteger);
  419. BillsMeasureData.sdvBillsMeasure.LocateInControl(Rec);
  420. end;
  421. end;
  422. function TZJJLData.GetDrawingCode(ANode: TsdIDTreeNode): string;
  423. var
  424. vNode: TBillsIDTreeNode;
  425. begin
  426. Result := '';
  427. vNode := TBillsIDTreeNode(ANode);
  428. while (Result = '') and Assigned(vNode) do
  429. begin
  430. if Assigned(vNode.Rec) then
  431. Result := vNode.Rec.DrawingCode.AsString;
  432. vNode := TBillsIDTreeNode(vNode.Parent);
  433. end;
  434. end;
  435. procedure TZJJLData.CheckZjjlVerison;
  436. procedure LoadVersion0Info;
  437. var
  438. i: Integer;
  439. Rec: TsdDataRecord;
  440. ZJJLInfoRec: TZJJLInfoRec;
  441. begin
  442. for i := 0 to sddZJJL.RecordCount - 1 do
  443. begin
  444. Rec := sddZJJL.Records[i];
  445. ZJJLInfoRec := GetInfoRec(Rec.ValueByName('BillsID').AsInteger, Rec.ValueByName('Type').AsInteger);
  446. Rec.ValueByName('BGLCode').AsString := ZJJLInfoRec.BGLCode;
  447. Rec.ValueByName('PegName').AsString := ZJJLInfoRec.PegName;
  448. Rec.ValueByName('FBFXName').AsString := ZJJLInfoRec.FBFXName;
  449. Rec.ValueByName('UnitName').AsString := ZJJLInfoRec.UnitName;
  450. Rec.ValueByName('DrawingCode').AsString := ZJJLInfoRec.DrawingCode;
  451. end;
  452. end;
  453. procedure LoadVersion0History;
  454. var
  455. i, j, iNewID: Integer;
  456. Rec: TsdDataRecord;
  457. begin
  458. for i := 0 to sddZJJL.RecordCount - 1 do
  459. begin
  460. Rec := sddZJJL.Records[i];
  461. SetHistory('CertificateCode', Rec.ValueByName('CertificateCode').AsString, Rec);
  462. SetHistory('FormulaMemo', Rec.ValueByName('FormulaMemo').AsString, Rec);
  463. SetHistory('RelaFile', Rec.ValueByName('RelaFile').AsString, Rec);
  464. end;
  465. end;
  466. begin
  467. if TPhaseData(PhaseData).PhaseProperty.ZjjlVersion = 0 then
  468. begin
  469. TPhaseData(PhaseData).PhaseProperty.ZJJLPreText := TProjectData(TPhaseData(PhaseData).ProjectData).ProjProperties.ZJJLPreText;
  470. LoadVersion0Info;
  471. LoadVersion0History;
  472. end;
  473. end;
  474. function TZJJLData.GetInfoRec_2(ABillsID, AType: Integer): TZJJLInfoRec;
  475. begin
  476. if AType = 0 then
  477. Result := GetInfoRecByCode_2(ABillsID)
  478. else if AType = 1 then
  479. Result := GetInfoRecByB_Code_2(ABillsID);
  480. end;
  481. function TZJJLData.GetInfoRecByB_Code_2(ABillsID: Integer): TZJJLInfoRec;
  482. var
  483. vNode: TsdIDTreeNode;
  484. sPeg: string;
  485. vPegFilter: TPegStrFilter;
  486. begin
  487. vNode := MainBillsTree.FindNode(ABillsID);
  488. sPeg := GetPegName(vNode);
  489. Result.BGLCode := GetBGLCode(vNode);
  490. if Assigned(vNode.Parent) then
  491. Result.PegName := vNode.Parent.Rec.ValueByName('Name').AsString;
  492. if sPeg <> '' then
  493. begin
  494. vPegFilter := TPegStrFilter.Create;
  495. vPegFilter.PegStr := sPeg;
  496. Result.BeginPeg := vPegFilter.BeginPeg;
  497. Result.EndPeg := vPegFilter.EndPeg;
  498. vPegFilter.Free;
  499. end;
  500. Result.UnitName := vNode.Rec.ValueByName('Name').AsString;
  501. Result.DrawingCode := GetDrawingCode(vNode);
  502. end;
  503. function TZJJLData.GetInfoRecByCode_2(ABillsID: Integer): TZJJLInfoRec;
  504. var
  505. vPeg, vNode: TsdIDTreeNode;
  506. vPegFilter: TPegStrFilter;
  507. begin
  508. vNode := MainBillsTree.FindNode(ABillsID);
  509. vPeg := GetPegNode(vNode);
  510. Result.BGLCode := GetBGLCode(vNode);
  511. Result.PegName := GetFieldStrDef(vPeg, 'Name', '');
  512. if Result.PegName <> '' then
  513. begin
  514. vPegFilter := TPegStrFilter.Create;
  515. vPegFilter.PegStr := Result.PegName;
  516. Result.BeginPeg := vPegFilter.BeginPeg;
  517. Result.EndPeg := vPegFilter.EndPeg;
  518. vPegFilter.Free;
  519. end;
  520. Result.FBFXName := GetFBFXName(vNode, vPeg);
  521. Result.UnitName := GetFieldStrDef(vNode, 'Name', '');
  522. Result.DrawingCode := GetDrawingCode(vNode);
  523. end;
  524. function TZJJLData.GetBGLCode(ANode: TsdIDTreeNode): string;
  525. begin
  526. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  527. Result := BillsMeasureData.GatherRelaBGL(ANode);
  528. end;
  529. function TZJJLData.GetPegName(ANode: TsdIDTreeNode): string;
  530. var
  531. vPeg: TsdIDTreeNode;
  532. begin
  533. vPeg := GetPegNode(ANode);
  534. Result := GetFieldStrDef(vPeg, 'Name', '');
  535. end;
  536. function TZJJLData.GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName,
  537. ADef: string): string;
  538. begin
  539. if Assigned(ANode) then
  540. Result := ANode.Rec.ValueByName(AFieldName).AsString
  541. else
  542. Result := '';
  543. end;
  544. function TZJJLData.GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
  545. begin
  546. Result := nil;
  547. if not Assigned(ANode) then Exit;
  548. if CheckPeg(ANode.Rec.ValueByName('Name').AsString) then
  549. Result := ANode
  550. else
  551. Result := GetPegNode(ANode.Parent);
  552. end;
  553. function TZJJLData.GetFBFXName(ANode, APegNode: TsdIDTreeNode): string;
  554. var
  555. vCurNode: TsdIDTreeNode;
  556. begin
  557. Result := '';
  558. if not Assigned(ANode) then Exit;
  559. // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)
  560. if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then
  561. begin
  562. // 取树结构的第三、四层节点的名称
  563. Result := GetNameByLevel(ANode, 2);
  564. if (Result <> '') and (GetNameByLevel(ANode, 3) <> '') then
  565. Result := Result + ',';
  566. Result := Result + GetNameByLevel(ANode, 3);
  567. end
  568. // 否则,合并[桩号节点的子节点]至[计量单元节点的父节点]的名称
  569. else
  570. begin
  571. vCurNode := ANode.Parent;
  572. // 转化为判断层次,层次大于[桩号节点的子节点]的层次
  573. while vCurNode.Level > APegNode.Level do
  574. begin
  575. Result := vCurNode.Rec.ValueByName('Name').AsString + ',' + Result;
  576. vCurNode := vCurNode.Parent;
  577. end;
  578. end;
  579. end;
  580. function TZJJLData.GetNameByLevel(ANode: TsdIDTreeNode;
  581. ALevel: Integer): string;
  582. begin
  583. Result := '';
  584. if not Assigned(ANode) then Exit;
  585. if ANode.Level = ALevel then
  586. Result := ANode.Rec.ValueByName('Name').AsString
  587. else if ANode.Level > ALevel then
  588. Result := GetNameByLevel(ANode.Parent, ALevel);
  589. end;
  590. procedure TZJJLData.SetHistory(const AFieldName, AValue: string;
  591. AZJJL_Rec: TsdDataRecord);
  592. var
  593. HistoryRec: TsdDataRecord;
  594. begin
  595. HistoryRec := sddHistory.FindKey('idxHistory', VarArrayOf([AZJJL_Rec.ValueByName('BillsID').AsInteger,
  596. AZJJL_Rec.ValueByName('Type').AsInteger, AFieldName]));
  597. if not Assigned(HistoryRec) then
  598. begin
  599. HistoryRec := sddHistory.Add;
  600. HistoryRec.ValueByName('ID').AsInteger := GetNewHistoryID;
  601. HistoryRec.ValueByName('BillsID').AsInteger := AZJJL_Rec.ValueByName('BillsID').AsInteger;
  602. HistoryRec.ValueByName('Type').AsInteger := AZJJL_Rec.ValueByName('Type').AsInteger;
  603. HistoryRec.ValueByName('FieldName').AsString := AFieldName;
  604. end;
  605. HistoryRec.ValueByName('FieldValue').AsString := AValue;
  606. end;
  607. function TZJJLData.GetNewHistoryID: Integer;
  608. var
  609. idx: TsdIndex;
  610. begin
  611. idx := sddHistory.FindIndex('idxID');
  612. if idx.RecordCount = 0 then
  613. Result := 1
  614. else
  615. Result := idx.Records[idx.RecordCount - 1].ValueByName('ID').AsInteger + 1;
  616. end;
  617. procedure TZJJLData.sdvZJJLBeforeValueChange(AValue: TsdValue;
  618. const NewValue: Variant; var Allow: Boolean);
  619. function CheckFieldNeedHistory(const AFieldName: string): Boolean;
  620. begin
  621. Result := SameText(AFieldName, 'Code') or
  622. SameText(AFieldName, 'CertificateCode') or
  623. SameText(AFieldName, 'BGLCode') or
  624. SameText(AFieldName, 'PegName') or
  625. SameText(AFieldName, 'BeginPeg') or
  626. SameText(AFieldName, 'EndPeg') or
  627. SameText(AFieldName, 'FBFXName') or
  628. SameText(AFieldName, 'UnitName') or
  629. SameText(AFieldName, 'DrawingCode') or
  630. SameText(AFieldName, 'FormulaMemo') or
  631. SameText(AFieldName, 'RelaFile');
  632. end;
  633. var
  634. sNewValue: string;
  635. begin
  636. if CheckFieldNeedHistory(AValue.FieldName) then
  637. begin
  638. sNewValue := VarToStrDef(NewValue, '');
  639. if sNewValue <> AValue.AsString then
  640. SetHistory(AValue.FieldName, sNewValue, AValue.Owner);
  641. end;
  642. end;
  643. end.