rmXmjBGLDetailDm.pas 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. unit rmXmjBGLDetailDm;
  2. interface
  3. uses
  4. SysUtils, Classes, DB, DBClient, ProjectData, sdIDTree, sdDB;
  5. type
  6. TBGLNode = class
  7. private
  8. FBGLCode: string;
  9. FBGLName: string;
  10. FBGLReason: string;
  11. FDirection: string;
  12. FBGLType: string;
  13. FDrawingCode: string;
  14. FApprovalCode: string;
  15. FBGLRelaFile: string;
  16. end;
  17. TXmjNode = class
  18. private
  19. FChildList: TList;
  20. FBGLList: TList;
  21. FCode: string;
  22. FName: string;
  23. FDgnQuantity1: Double;
  24. FDgnQuantity2: Double;
  25. FEndDealTotalPrice: Double;
  26. FEndGatherTotalPrice: Double;
  27. FTotalPrice: Double;
  28. FEndQcTotalPrice: Double;
  29. function GetChildCount: Integer;
  30. function GetChildNode(AIndex: Integer): TXmjNode;
  31. function GetBGLCount: Integer;
  32. function GetBGLNode(AIndex: Integer): TBGLNode;
  33. public
  34. constructor Create;
  35. destructor Destroy; override;
  36. function FindBGLNode(const ABGLCode: string): TBGLNode;
  37. property ChildCount: Integer read GetChildCount;
  38. property ChildNode[AIndex: Integer]: TXmjNode read GetChildNode;
  39. property BGLCount: Integer read GetBGLCount;
  40. property BGLNode[AIndex: Integer]: TBGLNode read GetBGLNode;
  41. end;
  42. TrmXmjBGLDetailData = class(TDataModule)
  43. cdsXmjBGLDetail: TClientDataSet;
  44. cdsXmjBGLDetailCode: TStringField;
  45. cdsXmjBGLDetailName: TWideStringField;
  46. cdsXmjBGLDetailDgnQuantity1: TFloatField;
  47. cdsXmjBGLDetailDgnQuantity2: TFloatField;
  48. cdsXmjBGLDetailDgnQuantity: TStringField;
  49. cdsXmjBGLDetailXmj_BGLName: TWideStringField;
  50. cdsXmjBGLDetailBGLCode: TWideStringField;
  51. cdsXmjBGLDetailBGLName: TWideStringField;
  52. cdsXmjBGLDetailBGLType: TWideStringField;
  53. cdsXmjBGLDetailReason: TWideStringField;
  54. cdsXmjBGLDetailDirection: TWideStringField;
  55. cdsXmjBGLDetailEndDealTotalPrice: TFloatField;
  56. cdsXmjBGLDetailEndGatherTotalPrice: TFloatField;
  57. cdsXmjBGLDetailBGTotalPrice: TFloatField;
  58. cdsXmjBGLDetailDrawingCode: TWideStringField;
  59. cdsXmjBGLDetailApprovalCode: TWideStringField;
  60. cdsXmjBGLDetailBGLRelaFile: TWideStringField;
  61. cdsXmjBGLDetailMemoStr: TWideStringField;
  62. cdsXmjBGLDetailTotalPrice: TFloatField;
  63. cdsXmjBGLDetailEndQcTotalPrice: TFloatField;
  64. cdsXmjBGLDetailFinalTotalPrice: TFloatField;
  65. private
  66. FProjectData: TProjectData;
  67. FClassXmjList: TList;
  68. function GetDgnQuantity(ANum1, ANum2: Double): string;
  69. procedure AddBGL(ABGLCode: string; AClassNode: TXmjNode);
  70. procedure AddBGLsData(ABGLCode: string; AClassNode: TXmjNode);
  71. procedure FilterNodeBGLData(ANode: TsdIDTreeNode; AClassNode: TXmjNode);
  72. procedure FilterBGLData(ANode: TsdIDTreeNode; AClassNode: TXmjNode);
  73. procedure AddDetailXmjNode(ANode: TsdIDTreeNode; AClassNode: TXmjNode);
  74. function CheckLeafXmj(ANode: TsdIDTreeNode): Boolean;
  75. function CheckHasBGL(ANode: TsdIDTreeNode): Boolean;
  76. procedure FilterDetailNode(ANode: TsdIDTreeNode; AClassNode: TXmjNode);
  77. procedure AddClassXmjNode(ANode: TsdIDTreeNode);
  78. function CheckChildNodeHasBGL(ANode: TsdIDTreeNode): Boolean;
  79. procedure FilterNode(ANode: TsdIDTreeNode);
  80. procedure WriteBGLNodeData(ABGLNode: TBGLNode);
  81. procedure WriteXmjNodeData(AXmjNode: TXmjNode; AIndex: Integer = -1);
  82. procedure WriteData;
  83. public
  84. function AssignData(AProjectData: TProjectData): TDataSet;
  85. end;
  86. implementation
  87. uses
  88. ZhAPI, DateUtils, BGLDm;
  89. {$R *.dfm}
  90. { TrmXmjBGLDetailData }
  91. procedure TrmXmjBGLDetailData.AddBGL(ABGLCode: string;
  92. AClassNode: TXmjNode);
  93. function FindBGL(const ABGLCode: string): Boolean;
  94. begin
  95. with FProjectData.BGLData do
  96. begin
  97. Result := False;
  98. cdsBGL.First;
  99. while not cdsBGL.Eof do
  100. begin
  101. if SameText(cdsBGLCode.AsString, ABGLCode) then
  102. begin
  103. Result := True;
  104. Break;
  105. end;
  106. cdsBGL.Next;
  107. end;
  108. end;
  109. end;
  110. var
  111. BGLNode: TBGLNode;
  112. begin
  113. BGLNode := AClassNode.FindBGLNode(ABGLCode);
  114. if not Assigned(BGLNode) then
  115. begin
  116. BGLNode := TBGLNode.Create;
  117. BGLNode.FBGLCode := ABGLCode;
  118. with FProjectData.BGLData do
  119. begin
  120. if FindBGL(ABGLCode) then
  121. begin
  122. BGLNode.FBGLName := cdsBGLName.AsString;
  123. BGLNode.FBGLReason := cdsBGLPos_Reason.AsString;
  124. BGLNode.FDirection := cdsBGLDirection.AsString;
  125. BGLNode.FBGLType := '';
  126. BGLNode.FDrawingCode := cdsBGLDrawingCode.AsString;
  127. BGLNode.FApprovalCode := cdsBGLApprovalCode.AsString;
  128. BGLNode.FBGLRelaFile := '';
  129. end;
  130. end;
  131. AClassNode.FBGLList.Add(BGLNode);
  132. end;
  133. end;
  134. procedure TrmXmjBGLDetailData.AddBGLsData(ABGLCode: string;
  135. AClassNode: TXmjNode);
  136. var
  137. sgs: TStrings;
  138. i: Integer;
  139. begin
  140. if ABGLCode = '' then Exit;
  141. sgs := TStringList.Create;
  142. try
  143. sgs.Delimiter := ';';
  144. sgs.DelimitedText := ABGLCode;
  145. for i := 0 to sgs.Count - 1 do
  146. AddBGL(sgs.Strings[i], AClassNode);
  147. finally
  148. sgs.Free;
  149. end;
  150. end;
  151. procedure TrmXmjBGLDetailData.AddClassXmjNode(ANode: TsdIDTreeNode);
  152. var
  153. XmjNode: TXmjNode;
  154. StageRec: TsdDataRecord;
  155. begin
  156. if not Assigned(ANode) then Exit;
  157. XmjNode := TXmjNode.Create;
  158. FClassXmjList.Add(XmjNode);
  159. XmjNode.FCode := ANode.Rec.ValueByName('Code').AsString;
  160. XmjNode.FName := ANode.Rec.ValueByName('Name').AsString;
  161. XmjNode.FDgnQuantity1 := ANode.Rec.ValueByName('DgnQuantity1').AsFloat;
  162. XmjNode.FDgnQuantity2 := ANode.Rec.ValueByName('DgnQuantity2').AsFloat;
  163. XmjNode.FTotalPrice := ANode.Rec.ValueByName('TotalPrice').AsFloat;
  164. if FProjectData.PhaseData.Active then
  165. begin
  166. StageRec := FProjectData.PhaseData.StageData.StageRecord(ANode.ID);
  167. if Assigned(StageRec) then
  168. begin
  169. XmjNode.FEndDealTotalPrice := StageRec.ValueByName('EndDealTotalPrice').AsFloat;
  170. XmjNode.FEndGatherTotalPrice := StageRec.ValueByName('EndGatherTotalPrice').AsFloat;
  171. XmjNode.FEndQcTotalPrice := StageRec.ValueByName('EndQcTotalPrice').AsFloat;
  172. end;
  173. end;
  174. FilterDetailNode(ANode, XmjNode);
  175. end;
  176. procedure TrmXmjBGLDetailData.AddDetailXmjNode(ANode: TsdIDTreeNode;
  177. AClassNode: TXmjNode);
  178. var
  179. DetailNode: TXmjNode;
  180. StageRec: TsdDataRecord;
  181. begin
  182. DetailNode := TXmjNode.Create;
  183. AClassNode.FChildList.Add(DetailNode);
  184. DetailNode.FName := ANode.Rec.ValueByName('Name').AsString;
  185. DetailNode.FDgnQuantity1 := ANode.Rec.ValueByName('DgnQuantity1').AsFloat;
  186. DetailNode.FDgnQuantity2 := ANode.Rec.ValueByName('DgnQuantity2').AsFloat;
  187. DetailNode.FTotalPrice := ANode.Rec.ValueByName('TotalPrice').AsFloat;
  188. if FProjectData.PhaseData.Active then
  189. begin
  190. StageRec := FProjectData.PhaseData.StageData.StageRecord(ANode.ID);
  191. if Assigned(StageRec) then
  192. begin
  193. DetailNode.FEndDealTotalPrice := StageRec.ValueByName('EndDealTotalPrice').AsFloat;
  194. DetailNode.FEndGatherTotalPrice := StageRec.ValueByName('EndGatherTotalPrice').AsFloat;
  195. DetailNode.FEndQcTotalPrice := StageRec.ValueByName('EndQcTotalPrice').AsFloat;
  196. end;
  197. end;
  198. FilterBGLData(ANode, DetailNode);
  199. end;
  200. function TrmXmjBGLDetailData.AssignData(
  201. AProjectData: TProjectData): TDataSet;
  202. begin
  203. FProjectData := AProjectData;
  204. FClassXmjList := TList.Create;
  205. cdsXmjBGLDetail.Active := True;
  206. cdsXmjBGLDetail.EmptyDataSet;
  207. cdsXmjBGLDetail.DisableControls;
  208. try
  209. FilterNode(AProjectData.BillsCompileData.BillsCompileTree.FirstNode);
  210. WriteData;
  211. finally
  212. cdsXmjBGLDetail.EnableControls;
  213. Result := cdsXmjBGLDetail;
  214. ClearObjects(FClassXmjList);
  215. FClassXmjList.Free;
  216. end;
  217. end;
  218. function TrmXmjBGLDetailData.CheckChildNodeHasBGL(
  219. ANode: TsdIDTreeNode): Boolean;
  220. var
  221. iNext, iTotal: Integer;
  222. vChild: TsdIDTreeNode;
  223. begin
  224. Result := False;
  225. if not Assigned(ANode) then Exit;
  226. iNext := 1;
  227. iTotal := ANode.PosterityCount;
  228. vChild := ANode.NextNode;
  229. while (iNext <= iTotal) and not Result do
  230. begin
  231. if not vChild.HasChildren then
  232. Result := CheckHasBGL(vChild);
  233. vChild := vChild.NextNode;
  234. Inc(iNext);
  235. end;
  236. end;
  237. function TrmXmjBGLDetailData.CheckHasBGL(ANode: TsdIDTreeNode): Boolean;
  238. var
  239. StageRec: TsdDataRecord;
  240. begin
  241. Result := False;
  242. StageRec := FProjectData.PhaseData.StageData.StageRecord(ANode.ID);
  243. if Assigned(StageRec) then
  244. Result := (StageRec.ValueByName('EndQcTotalPrice').AsFloat <> 0)
  245. or (StageRec.ValueByName('EndPcTotalPrice').AsFloat <> 0);
  246. end;
  247. function TrmXmjBGLDetailData.CheckLeafXmj(ANode: TsdIDTreeNode): Boolean;
  248. var
  249. i: Integer;
  250. begin
  251. Result := True;
  252. for i := 0 to ANode.ChildCount - 1 do
  253. begin
  254. if ANode.ChildNodes[i].Rec.ValueByName('B_Code').AsString = '' then
  255. begin
  256. Result := False;
  257. Break;
  258. end;
  259. end;
  260. end;
  261. procedure TrmXmjBGLDetailData.FilterBGLData(ANode: TsdIDTreeNode;
  262. AClassNode: TXmjNode);
  263. var
  264. i: Integer;
  265. begin
  266. if not Assigned(ANode) then Exit;
  267. if ANode.HasChildren then
  268. for i := 0 to ANode.ChildCount - 1 do
  269. FilterBGLData(ANode.ChildNodes[i], AClassNode)
  270. else
  271. FilterNodeBGLData(ANode, AClassNode);
  272. end;
  273. procedure TrmXmjBGLDetailData.FilterDetailNode(ANode: TsdIDTreeNode;
  274. AClassNode: TXmjNode);
  275. var
  276. i: Integer;
  277. begin
  278. if not Assigned(ANode) and (ANode.Level < 2) then Exit;
  279. if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
  280. if CheckLeafXmj(ANode) and CheckHasBGL(ANode) then
  281. AddDetailXmjNode(ANode, AClassNode);
  282. if ANode.HasChildren then
  283. begin
  284. for i := 0 to ANode.ChildCount - 1 do
  285. FilterDetailNode(ANode.ChildNodes[i], AClassNode);
  286. end;
  287. end;
  288. procedure TrmXmjBGLDetailData.FilterNode(ANode: TsdIDTreeNode);
  289. begin
  290. if not Assigned(ANode) then Exit;
  291. if ANode.Level> 1 then Exit;
  292. if ANode.Level = 0 then
  293. FilterNode(ANode.FirstChild)
  294. else if CheckHasBGL(ANode) then
  295. AddClassXmjNode(ANode);
  296. FilterNode(ANode.NextSibling);
  297. end;
  298. procedure TrmXmjBGLDetailData.FilterNodeBGLData(ANode: TsdIDTreeNode;
  299. AClassNode: TXmjNode);
  300. var
  301. StageRec: TsdDataRecord;
  302. begin
  303. StageRec := FProjectData.PhaseData.StageData.StageRecord(ANode.ID);
  304. if not Assigned(StageRec) then Exit;
  305. AddBGLsData(StageRec.ValueByName('EndQcBGLCode').AsString, AClassNode);
  306. AddBGLsData(StageRec.ValueByName('EndPcBGLCode').AsString, AClassNode);
  307. end;
  308. function TrmXmjBGLDetailData.GetDgnQuantity(ANum1, ANum2: Double): string;
  309. begin
  310. Result := '';
  311. if ANum1 <> 0 then
  312. begin
  313. Result := FloatToStr(ANum1);
  314. if ANum2 <> 0 then
  315. Result := Result + '/' + FloatToStr(ANum2);
  316. end;
  317. end;
  318. procedure TrmXmjBGLDetailData.WriteBGLNodeData(ABGLNode: TBGLNode);
  319. begin
  320. cdsXmjBGLDetail.Append;
  321. cdsXmjBGLDetailXmj_BGLName.AsString := ABGLNode.FBGLName;
  322. cdsXmjBGLDetailBGLCode.AsString := ABGLNode.FBGLCode;
  323. cdsXmjBGLDetailBGLName.AsString := ABGLNode.FBGLName;
  324. cdsXmjBGLDetailReason.AsString := ABGLNode.FBGLReason;
  325. cdsXmjBGLDetailDirection.AsString := ABGLNode.FDirection;
  326. cdsXmjBGLDetailDrawingCode.AsString := ABGLNode.FDrawingCode;
  327. cdsXmjBGLDetailApprovalCode.AsString := ABGLNode.FApprovalCode;
  328. cdsXmjBGLDetailBGLRelaFile.AsString := ABGLNode.FBGLRelaFile;
  329. cdsXmjBGLDetail.Post;
  330. end;
  331. procedure TrmXmjBGLDetailData.WriteData;
  332. var
  333. i: Integer;
  334. begin
  335. for i := 0 to FClassXmjList.Count - 1 do
  336. WriteXmjNodeData(TXmjNode(FClassXmjList.Items[i]));
  337. end;
  338. procedure TrmXmjBGLDetailData.WriteXmjNodeData(AXmjNode: TXmjNode;
  339. AIndex: Integer);
  340. var
  341. i: Integer;
  342. begin
  343. cdsXmjBGLDetail.Append;
  344. if AIndex = -1 then
  345. cdsXmjBGLDetailCode.AsString := AXmjNode.FCode
  346. else
  347. cdsXmjBGLDetailCode.AsString := IntToStr(AIndex + 1);
  348. cdsXmjBGLDetailName.AsString := AXmjNode.FName;
  349. cdsXmjBGLDetailDgnQuantity1.AsFloat := AXmjNode.FDgnQuantity1;
  350. cdsXmjBGLDetailDgnQuantity2.AsFloat := AXmjNode.FDgnQuantity2;
  351. cdsXmjBGLDetailDgnQuantity.AsString := GetDgnQuantity(AXmjNode.FDgnQuantity1, AXmjNode.FDgnQuantity2);
  352. cdsXmjBGLDetailEndDealTotalPrice.AsFloat := AXmjNode.FEndDealTotalPrice;
  353. cdsXmjBGLDetailEndGatherTotalPrice.AsFloat := AXmjNode.FEndGatherTotalPrice;
  354. cdsXmjBGLDetailBGTotalPrice.AsFloat := AXmjNode.FEndGatherTotalPrice - AXmjNode.FEndDealTotalPrice;
  355. cdsXmjBGLDetailTotalPrice.AsFloat := AXmjNode.FTotalPrice;
  356. cdsXmjBGLDetailEndQcTotalPrice.AsFloat := AXmjNode.FEndQcTotalPrice;
  357. cdsXmjBGLDetailFinalTotalPrice.AsFloat := AXmjNode.FTotalPrice + AXmjNode.FEndQcTotalPrice;
  358. cdsXmjBGLDetailXmj_BGLName.AsString := AXmjNode.FName;
  359. cdsXmjBGLDetail.Post;
  360. for i := 0 to AXmjNode.BGLCount - 1 do
  361. WriteBGLNodeData(AXmjNode.BGLNode[i]);
  362. for i := 0 to AXmjNode.ChildCount - 1 do
  363. WriteXmjNodeData(AXmjNode.ChildNode[i], i);
  364. end;
  365. { TXmjNode }
  366. constructor TXmjNode.Create;
  367. begin
  368. FChildList := TList.Create;
  369. FBGLList := TList.Create;
  370. end;
  371. destructor TXmjNode.Destroy;
  372. begin
  373. ClearObjects(FBGLList);
  374. FBGLList.Free;
  375. ClearObjects(FChildList);
  376. FChildList.Free;
  377. inherited;
  378. end;
  379. function TXmjNode.FindBGLNode(const ABGLCode: string): TBGLNode;
  380. var
  381. i: Integer;
  382. begin
  383. Result := nil;
  384. for i := 0 to BGLCount - 1 do
  385. begin
  386. if BGLNode[i].FBGLCode = ABGLCode then
  387. begin
  388. Result := BGLNode[i];
  389. Break;
  390. end;
  391. end;
  392. end;
  393. function TXmjNode.GetBGLCount: Integer;
  394. begin
  395. Result := FBGLList.Count;
  396. end;
  397. function TXmjNode.GetBGLNode(AIndex: Integer): TBGLNode;
  398. begin
  399. Result := TBGLNode(FBGLList.Items[AIndex]);
  400. end;
  401. function TXmjNode.GetChildCount: Integer;
  402. begin
  403. Result := FChildList.Count;
  404. end;
  405. function TXmjNode.GetChildNode(AIndex: Integer): TXmjNode;
  406. begin
  407. Result := TXmjNode(FChildList.Items[AIndex]);
  408. end;
  409. end.