ZJJLDm.pas 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. unit ZJJLDm;
  2. interface
  3. uses
  4. ZjGrid,
  5. SysUtils, Classes, DB, DBClient, ADODB, sdIDTree, sdDB, Provider,
  6. Windows, BillsTree;
  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. BGLCode: string;
  23. DrawingCode: string;
  24. UnitName: string;
  25. end;
  26. TZJJLData = class(TDataModule)
  27. atZJJL: TADOTable;
  28. dspZJJL: TDataSetProvider;
  29. cdsZJJL: TClientDataSet;
  30. cdsZJJLID: TIntegerField;
  31. cdsZJJLBillsID: TIntegerField;
  32. cdsZJJLCode: TWideStringField;
  33. cdsZJJLCertificateCode: TWideStringField;
  34. cdsZJJLBillsCode: TWideStringField;
  35. cdsZJJLFormulaMemo: TMemoField;
  36. cdsZJJLType: TIntegerField;
  37. cdsZJJLView: TClientDataSet;
  38. cdsZJJLViewID: TIntegerField;
  39. cdsZJJLViewBillsID: TIntegerField;
  40. cdsZJJLViewCode: TWideStringField;
  41. cdsZJJLViewCertificateCode: TWideStringField;
  42. cdsZJJLViewBillsCode: TWideStringField;
  43. cdsZJJLViewFormulaMemo: TMemoField;
  44. cdsZJJLViewType: TIntegerField;
  45. cdsZJJLRelaFile: TMemoField;
  46. cdsZJJLViewRelaFile: TMemoField;
  47. procedure cdsZJJLViewAfterScroll(DataSet: TDataSet);
  48. private
  49. FPhaseData: TObject;
  50. FCanModified: Boolean;
  51. FNewID: Integer;
  52. FOrgDataList: TList;
  53. FDetailGrid: TZJGrid;
  54. procedure GenerateZJJLNode(ANode: TsdIDTreeNode; AType: Integer);
  55. function CheckLastXmj(AID: Integer): Boolean;
  56. function CheckBGExist(ANode: TsdIDTreeNode): Boolean;
  57. function CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;
  58. procedure GenerateLastXmj(ANode: TsdIDTreeNode);
  59. procedure GenerateNode(ANode: TsdIDTreeNode);
  60. procedure GenerateLeafNode(ANode: TsdIDTreeNode);
  61. procedure GenerateNodeByB_Code(ANode: TsdIDTreeNode);
  62. procedure DeleteAll;
  63. procedure RestoreOrgData;
  64. procedure DetailGridCellCanEdit(Sender: TObject; const ACoord: TPoint;
  65. var Allow: Boolean);
  66. procedure DetailGridCellTextChanged(Sender: TObject; Col, Row: Integer);
  67. // 向父项检测,直至提取到图册号为止
  68. function GetDrawingCode(ANode: TsdIDTreeNode): string;
  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;
  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. property DetailGrid: TZJGrid read FDetailGrid;
  86. end;
  87. implementation
  88. uses
  89. PhaseData, ProjectData, BillsDm, UtilMethods, ProjectProperty, ZhAPI,
  90. BillsCompileDm, BillsMeasureDm;
  91. {$R *.dfm}
  92. { TZJJLData }
  93. constructor TZJJLData.Create(APhaseData: TObject);
  94. begin
  95. inherited Create(nil);
  96. FPhaseData := APhaseData;
  97. FOrgDataList := TList.Create;
  98. FDetailGrid := TZJGrid.Create(nil);
  99. FDetailGrid.Options := FDetailGrid.Options + [goWarpText];
  100. FDetailGrid.OnCellCanEdit := DetailGridCellCanEdit;
  101. FDetailGrid.OnCellTextChanged := DetailGridCellTextChanged;
  102. end;
  103. destructor TZJJLData.Destroy;
  104. begin
  105. FDetailGrid.Free;
  106. ClearObjects(FOrgDataList);
  107. FOrgDataList.Free;
  108. inherited;
  109. end;
  110. function TZJJLData.GetMainBillsTree: TsdIDTree;
  111. begin
  112. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  113. Result := BillsMeasureData.BillsMeasureTree;
  114. end;
  115. procedure TZJJLData.Open(AConnection: TADOConnection);
  116. begin
  117. atZJJL.Connection := AConnection;
  118. cdsZJJL.Open;
  119. cdsZJJL.IndexFieldNames := 'ID';
  120. cdsZJJLView.CloneCursor(cdsZJJL, True);
  121. cdsZJJLView.IndexFieldNames := 'ID';
  122. end;
  123. procedure TZJJLData.Save;
  124. begin
  125. cdsZJJL.ApplyUpdates(0);
  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;
  138. var
  139. iRowIndex: Integer;
  140. InfoRec: TZJJLInfoRec;
  141. begin
  142. FDetailGrid.OnCellTextChanged := nil;
  143. FDetailGrid.FixedRowCount := 0;
  144. FDetailGrid.FixedColCount := 0;
  145. FDetailGrid.ColCount := 1;
  146. FDetailGrid.RowCount := 9;
  147. FDetailGrid.DefaultColWidth := 300;
  148. for iRowIndex := 0 to FDetailGrid.RowCount - 1 do
  149. FDetailGrid[0, iRowIndex].Align := gaTopLeft;
  150. InfoRec := GetInfoRec(cdsZJJLViewBillsID.AsInteger, cdsZJJLViewType.AsInteger);
  151. FDetailGrid.Cells[0, 0].Text := '变更令号:' + InfoRec.BGLCode;
  152. FDetailGrid.Cells[0, 1].Text := '桩号或部位:' + InfoRec.PegName;
  153. FDetailGrid.Cells[0, 2].Text := '分部分项工程:' + InfoRec.FBFXName;
  154. FDetailGrid.Cells[0, 3].Text := '计量单元:' + InfoRec.UnitName;
  155. FDetailGrid.Cells[0, 4].Text := '图号:' + InfoRec.DrawingCode;
  156. FDetailGrid.Cells[0, 5].Text := '计算式说明:';
  157. FDetailGrid.Cells[0, 6].Text := cdsZJJLViewFormulaMemo.AsString;
  158. FDetailGrid.Cells[0, 6].Align := gaTopLeft;
  159. FDetailGrid.RowHeights[6] := 57;
  160. FDetailGrid.Cells[0, 7].Text := '计算草图几何尺寸:';
  161. FDetailGrid.Cells[0, 8].Text := cdsZJJLViewRelaFile.AsString;
  162. FDetailGrid.Cells[0, 8].Align := gaTopLeft;
  163. FDetailGrid.RowHeights[8] := 57;
  164. FDetailGrid.OnCellTextChanged := DetailGridCellTextChanged;
  165. end;
  166. procedure TZJJLData.GenerateAll;
  167. begin
  168. RestoreOrgData;
  169. FNewID := 1;
  170. DeleteAll;
  171. GenerateNode(MainBillsTree.FirstNode);
  172. end;
  173. procedure TZJJLData.GenerateNode(ANode: TsdIDTreeNode);
  174. begin
  175. if not Assigned(ANode) then Exit;
  176. if CheckLastXmj(ANode.ID) then
  177. GenerateLastXmj(ANode)
  178. else
  179. GenerateNode(ANode.FirstChild);
  180. GenerateNode(ANode.NextSibling);
  181. end;
  182. procedure TZJJLData.GenerateLastXmj(ANode: TsdIDTreeNode);
  183. begin
  184. if CheckMeasureExist(ANode) then
  185. GenerateZJJLNode(ANode, 0);
  186. end;
  187. function TZJJLData.CheckBGExist(ANode: TsdIDTreeNode): Boolean;
  188. function CheckBGLExist(AID: Integer): Boolean;
  189. var
  190. StageRec: TsdDataRecord;
  191. begin
  192. StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
  193. Result := Assigned(StageRec) and
  194. ((StageRec.ValueByName('QcBGLCode').AsString <> '')
  195. or (StageRec.ValueByName('PcBGLCode').AsString <> ''));
  196. end;
  197. var
  198. iChild: Integer;
  199. begin
  200. Result := False;
  201. if not Assigned(ANode) then Exit;
  202. if ANode.HasChildren then
  203. begin
  204. for iChild := 0 to ANode.ChildCount - 1 do
  205. begin
  206. Result := Result or CheckBGExist(ANode.ChildNodes[iChild]);
  207. if Result then Break;
  208. end;
  209. end
  210. else
  211. Result := CheckBGLExist(ANode.ID);
  212. end;
  213. procedure TZJJLData.DeleteAll;
  214. begin
  215. cdsZJJL.First;
  216. while not cdsZJJL.Eof do
  217. cdsZJJL.Delete;
  218. end;
  219. procedure TZJJLData.RestoreOrgData;
  220. function CreateNodeData: TZJJLNode;
  221. begin
  222. Result := TZJJLNode.Create;
  223. Result.FBillsID := cdsZJJLBillsID.AsInteger;
  224. Result.FCode := cdsZJJLCode.AsString;
  225. Result.FCertificateCode := cdsZJJLCertificateCode.AsString;
  226. Result.FBillsCode := cdsZJJLBillsCode.AsString;
  227. Result.FFormulaMemo := cdsZJJLFormulaMemo.AsString;
  228. Result.FRelaFile := cdsZJJLRelaFile.AsString;
  229. Result.FType := cdsZJJLType.AsInteger;
  230. end;
  231. begin
  232. FOrgDataList.Clear;
  233. cdsZJJL.First;
  234. while not cdsZJJL.Eof do
  235. begin
  236. FOrgDataList.Add(CreateNodeData);
  237. cdsZJJL.Next;
  238. end;
  239. end;
  240. function TZJJLData.CheckMeasureExist(ANode: TsdIDTreeNode): Boolean;
  241. function CheckStageCompleteData(AID: Integer): Boolean;
  242. var
  243. StageRec: TsdDataRecord;
  244. begin
  245. StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
  246. Result := Assigned(StageRec) and
  247. ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)
  248. or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));
  249. end;
  250. var
  251. iChild: Integer;
  252. begin
  253. Result := False;
  254. if not Assigned(ANode) then Exit;
  255. if ANode.HasChildren then
  256. begin
  257. for iChild := 0 to ANode.ChildCount - 1 do
  258. begin
  259. Result := Result or CheckMeasureExist(ANode.ChildNodes[iChild]);
  260. if Result then Break;
  261. end;
  262. end
  263. else
  264. Result := CheckStageCompleteData(ANode.ID);
  265. end;
  266. procedure TZJJLData.cdsZJJLViewAfterScroll(DataSet: TDataSet);
  267. begin
  268. AssignedCurData;
  269. end;
  270. procedure TZJJLData.DetailGridCellCanEdit(Sender: TObject;
  271. const ACoord: TPoint; var Allow: Boolean);
  272. begin
  273. Allow := ((ACoord.Y = 6) or (ACoord.Y = 8)) and
  274. not TPhaseData(FPhaseData).StageDataReadOnly;
  275. end;
  276. function TZJJLData.GetInfoRecByCode(ABillsID: Integer): TZJJLInfoRec;
  277. function GetBGLCode(ANode: TsdIDTreeNode): string;
  278. begin
  279. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  280. Result := BillsMeasureData.GatherRelaBGL(ANode);
  281. end;
  282. function GetPegName(APegNode: TsdIDTreeNode): string;
  283. begin
  284. if Assigned(APegNode) then
  285. Result := APegNode.Rec.ValueByName('Name').AsString
  286. else
  287. Result := '';
  288. end;
  289. function GetPegNode(ANode: TsdIDTreeNode): TsdIDTreeNode;
  290. begin
  291. Result := nil;
  292. if not Assigned(ANode) then Exit;
  293. if CheckPeg(ANode.Rec.ValueByName('Name').AsString) then
  294. Result := ANode
  295. else
  296. Result := GetPegNode(ANode.Parent);
  297. end;
  298. // 取树结构的第ALevel层节点的名称(level从0开始)
  299. function GetNameByLevel(ANode: TsdIDTreeNode; ALevel: Integer): string;
  300. begin
  301. Result := '';
  302. if not Assigned(ANode) then Exit;
  303. if ANode.Level = ALevel then
  304. Result := ANode.Rec.ValueByName('Name').AsString
  305. else if ANode.Level > ALevel then
  306. Result := GetNameByLevel(ANode.Parent, ALevel);
  307. end;
  308. function GetFBFXName(ANode, APegNode: TsdIDTreeNode): string;
  309. var
  310. vCurNode: TsdIDTreeNode;
  311. begin
  312. Result := '';
  313. if not Assigned(ANode) then Exit;
  314. // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)
  315. if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then
  316. begin
  317. // 取树结构的第三、四层节点的名称
  318. Result := GetNameByLevel(ANode, 2);
  319. if (Result <> '') and (GetNameByLevel(ANode, 3) <> '') then
  320. Result := Result + ',';
  321. Result := Result + GetNameByLevel(ANode, 3);
  322. end
  323. // 否则,合并[桩号节点的子节点]至[计量单元节点的父节点]的名称
  324. else
  325. begin
  326. vCurNode := ANode.Parent;
  327. // 转化为判断层次,层次大于[桩号节点的子节点]的层次
  328. while vCurNode.Level > APegNode.Level do
  329. begin
  330. Result := vCurNode.Rec.ValueByName('Name').AsString + ',' + Result;
  331. vCurNode := vCurNode.Parent;
  332. end;
  333. end;
  334. end;
  335. function GetFieldStrDef(ANode: TsdIDTreeNode; const AFieldName, ADef: string): string;
  336. begin
  337. if Assigned(ANode) then
  338. Result := ANode.Rec.ValueByName(AFieldName).AsString
  339. else
  340. Result := '';
  341. end;
  342. var
  343. vPeg, vNode: TsdIDTreeNode;
  344. begin
  345. vNode := MainBillsTree.FindNode(ABillsID);
  346. vPeg := GetPegNode(vNode);
  347. Result.BGLCode := GetBGLCode(vNode);
  348. Result.PegName := GetPegName(vPeg);
  349. Result.FBFXName := GetFBFXName(vNode, vPeg);
  350. Result.UnitName := GetFieldStrDef(vNode, 'Name', '');
  351. Result.DrawingCode := GetDrawingCode(vNode);
  352. end;
  353. procedure TZJJLData.DetailGridCellTextChanged(Sender: TObject; Col,
  354. Row: Integer);
  355. begin
  356. if (Row = 6) then
  357. begin
  358. cdsZJJLView.Edit;
  359. cdsZJJLViewFormulaMemo.AsString := TZJGrid(Sender).Cells[Col, Row].Text;
  360. cdsZJJLView.Post;
  361. end
  362. else if (Row = 8) then
  363. begin
  364. cdsZJJLView.Edit;
  365. cdsZJJLViewRelaFile.AsString := TZJGrid(Sender).Cells[Col, Row].Text;
  366. cdsZJJLView.Post;
  367. end;
  368. end;
  369. procedure TZJJLData.GenerateAllByB_Code;
  370. begin
  371. RestoreOrgData;
  372. FNewID := 1;
  373. DeleteAll;
  374. GenerateNodeByB_Code(MainBillsTree.FirstNode);
  375. end;
  376. procedure TZJJLData.GenerateNodeByB_Code(ANode: TsdIDTreeNode);
  377. begin
  378. if not Assigned(ANode) then Exit;
  379. if ANode.HasChildren then
  380. GenerateNodeByB_Code(ANode.FirstChild)
  381. else
  382. GenerateLeafNode(ANode);
  383. GenerateNodeByB_Code(ANode.NextSibling);
  384. end;
  385. procedure TZJJLData.GenerateLeafNode(ANode: TsdIDTreeNode);
  386. function CheckMeasureExist(AID: Integer): Boolean;
  387. var
  388. StageRec: TsdDataRecord;
  389. begin
  390. StageRec := TPhaseData(FPhaseData).StageData.StageRecord(AID);
  391. Result := Assigned(StageRec) and
  392. ((StageRec.ValueByName('GatherQuantity').AsFloat <> 0)
  393. or (StageRec.ValueByName('GatherTotalPrice').AsFloat <> 0));
  394. end;
  395. begin
  396. if (ANode.Rec.ValueByName('B_Code').AsString <> '') and
  397. CheckMeasureExist(ANode.ID) then
  398. GenerateZJJLNode(ANode, 1);
  399. end;
  400. procedure TZJJLData.GenerateZJJLNode(ANode: TsdIDTreeNode;
  401. AType: Integer);
  402. function GetNewCode: string;
  403. begin
  404. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  405. begin
  406. Result := ProjProperties.ZJJLPreText;
  407. if (Result <> '') and (Result[Length(Result)] <> '-') then
  408. Result := Result + '-';
  409. Result := Result + Format('%d-%d', [PhaseIndex, FNewID]);
  410. end;
  411. end;
  412. function GetOrgZJJLNode(ABillsID: Integer): TZJJLNode;
  413. var
  414. iIndex: Integer;
  415. begin
  416. Result := nil;
  417. for iIndex := 0 to FOrgDataList.Count - 1 do
  418. // 7/30新增了一个“总量控制”模式,Type字段控制。真的是要疯掉了。
  419. if (TZJJLNode(FOrgDataList.Items[iIndex]).FBillsID = ABillsID)
  420. and (TZJJLNode(FOrgDataList.Items[iIndex]).FType = AType) then
  421. begin
  422. Result := TZJJLNode(FOrgDataList.Items[iIndex]);
  423. Break;
  424. end;
  425. end;
  426. var
  427. ZJJLNode: TZJJLNode;
  428. begin
  429. cdsZJJL.Append;
  430. cdsZJJLID.AsInteger := FNewID;
  431. cdsZJJLBillsID.AsInteger := ANode.ID;
  432. cdsZJJLType.AsInteger := AType;
  433. ZJJLNode := GetOrgZJJLNode(ANode.ID);
  434. cdsZJJLCode.AsString := GetNewCode;
  435. if AType = Ord(ztFx) then
  436. cdsZJJLBillsCode.AsString := ANode.Rec.ValueByName('Code').AsString
  437. else if AType = Ord(ztGcl) then
  438. cdsZJJLBillsCode.AsString := ANode.Rec.ValueByName('B_Code').AsString;
  439. if Assigned(ZJJLNode) then
  440. begin
  441. cdsZJJLCertificateCode.AsString := ZJJLNode.FCertificateCode;
  442. cdsZJJLFormulaMemo.AsString := ZJJLNode.FFormulaMemo;
  443. cdsZJJLRelaFile.AsString := ZJJLNode.FRelaFile;
  444. end;
  445. cdsZJJL.Post;
  446. Inc(FNewID);
  447. end;
  448. function TZJJLData.GetInfoRecByB_Code(ABillsID: Integer): TZJJLInfoRec;
  449. function GetBGLCode(ANode: TsdIDTreeNode): string;
  450. begin
  451. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  452. Result := BillsMeasureData.GatherRelaBGL(ANode);
  453. end;
  454. var
  455. vNode: TsdIDTreeNode;
  456. begin
  457. vNode := MainBillsTree.FindNode(ABillsID);
  458. Result.BGLCode := GetBGLCode(vNode);
  459. if Assigned(vNode.Parent) then
  460. Result.PegName := vNode.Parent.Rec.ValueByName('Name').AsString;
  461. Result.FBFXName := '';
  462. Result.UnitName := vNode.Rec.ValueByName('Name').AsString;
  463. Result.DrawingCode := GetDrawingCode(vNode);
  464. end;
  465. function TZJJLData.GetInfoRec(ABillsID, AType: Integer): TZJJLInfoRec;
  466. begin
  467. if AType = 0 then
  468. Result := GetInfoRecByCode(ABillsID)
  469. else if AType = 1 then
  470. Result := GetInfoRecByB_Code(ABillsID);
  471. end;
  472. procedure TZJJLData.LocateBills;
  473. var
  474. Rec: TsdDataRecord;
  475. begin
  476. with TProjectData(TPhaseData(FPhaseData).ProjectData) do
  477. begin
  478. Rec := BillsData.sddBills.FindKey('idxID', cdsZJJLViewBillsID.AsInteger);
  479. BillsMeasureData.sdvBillsMeasure.LocateInControl(Rec);
  480. end;
  481. end;
  482. function TZJJLData.GetDrawingCode(ANode: TsdIDTreeNode): string;
  483. var
  484. vNode: TBillsIDTreeNode;
  485. begin
  486. Result := '';
  487. vNode := TBillsIDTreeNode(ANode);
  488. while (Result = '') and Assigned(vNode) do
  489. begin
  490. if Assigned(vNode.Rec) then
  491. Result := vNode.Rec.DrawingCode.AsString;
  492. vNode := TBillsIDTreeNode(vNode.Parent);
  493. end;
  494. end;
  495. end.