ZJJLDm.pas 28 KB

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