ZJJLDm.pas 15 KB

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