rmXmjBGLDetailDm.pas 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  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. var
  94. BGLNode: TBGLNode;
  95. begin
  96. BGLNode := AClassNode.FindBGLNode(ABGLCode);
  97. if not Assigned(BGLNode) then
  98. begin
  99. BGLNode := TBGLNode.Create;
  100. BGLNode.FBGLCode := ABGLCode;
  101. with FProjectData.BGLData do
  102. begin
  103. if cdsBGL.Locate('Code', ABGLCode, []) then
  104. begin
  105. BGLNode.FBGLName := cdsBGLName.AsString;
  106. BGLNode.FBGLReason := cdsBGLPos_Reason.AsString;
  107. BGLNode.FDirection := cdsBGLDirection.AsString;
  108. BGLNode.FBGLType := '';
  109. BGLNode.FDrawingCode := cdsBGLDrawingCode.AsString;
  110. BGLNode.FApprovalCode := cdsBGLApprovalCode.AsString;
  111. BGLNode.FBGLRelaFile := '';
  112. end;
  113. end;
  114. AClassNode.FBGLList.Add(BGLNode);
  115. end;
  116. end;
  117. procedure TrmXmjBGLDetailData.AddBGLsData(ABGLCode: string;
  118. AClassNode: TXmjNode);
  119. var
  120. sgs: TStrings;
  121. i: Integer;
  122. begin
  123. if ABGLCode = '' then Exit;
  124. sgs := TStringList.Create;
  125. try
  126. sgs.Delimiter := ';';
  127. sgs.DelimitedText := ABGLCode;
  128. for i := 0 to sgs.Count - 1 do
  129. AddBGL(sgs.Strings[i], AClassNode);
  130. finally
  131. sgs.Free;
  132. end;
  133. end;
  134. procedure TrmXmjBGLDetailData.AddClassXmjNode(ANode: TsdIDTreeNode);
  135. var
  136. XmjNode: TXmjNode;
  137. StageRec: TsdDataRecord;
  138. begin
  139. if not Assigned(ANode) then Exit;
  140. XmjNode := TXmjNode.Create;
  141. FClassXmjList.Add(XmjNode);
  142. XmjNode.FCode := ANode.Rec.ValueByName('Code').AsString;
  143. XmjNode.FName := ANode.Rec.ValueByName('Name').AsString;
  144. XmjNode.FDgnQuantity1 := ANode.Rec.ValueByName('DgnQuantity1').AsFloat;
  145. XmjNode.FDgnQuantity2 := ANode.Rec.ValueByName('DgnQuantity2').AsFloat;
  146. XmjNode.FTotalPrice := ANode.Rec.ValueByName('TotalPrice').AsFloat;
  147. if FProjectData.PhaseData.Active then
  148. begin
  149. StageRec := FProjectData.PhaseData.StageData.StageRecord(ANode.ID);
  150. if Assigned(StageRec) then
  151. begin
  152. XmjNode.FEndDealTotalPrice := StageRec.ValueByName('EndDealTotalPrice').AsFloat;
  153. XmjNode.FEndGatherTotalPrice := StageRec.ValueByName('EndGatherTotalPrice').AsFloat;
  154. XmjNode.FEndQcTotalPrice := StageRec.ValueByName('EndQcTotalPrice').AsFloat;
  155. end;
  156. end;
  157. FilterDetailNode(ANode, XmjNode);
  158. end;
  159. procedure TrmXmjBGLDetailData.AddDetailXmjNode(ANode: TsdIDTreeNode;
  160. AClassNode: TXmjNode);
  161. var
  162. DetailNode: TXmjNode;
  163. StageRec: TsdDataRecord;
  164. begin
  165. DetailNode := TXmjNode.Create;
  166. AClassNode.FChildList.Add(DetailNode);
  167. DetailNode.FName := ANode.Rec.ValueByName('Name').AsString;
  168. DetailNode.FDgnQuantity1 := ANode.Rec.ValueByName('DgnQuantity1').AsFloat;
  169. DetailNode.FDgnQuantity2 := ANode.Rec.ValueByName('DgnQuantity2').AsFloat;
  170. DetailNode.FTotalPrice := ANode.Rec.ValueByName('TotalPrice').AsFloat;
  171. if FProjectData.PhaseData.Active then
  172. begin
  173. StageRec := FProjectData.PhaseData.StageData.StageRecord(ANode.ID);
  174. if Assigned(StageRec) then
  175. begin
  176. DetailNode.FEndDealTotalPrice := StageRec.ValueByName('EndDealTotalPrice').AsFloat;
  177. DetailNode.FEndGatherTotalPrice := StageRec.ValueByName('EndGatherTotalPrice').AsFloat;
  178. DetailNode.FEndQcTotalPrice := StageRec.ValueByName('EndQcTotalPrice').AsFloat;
  179. end;
  180. end;
  181. FilterBGLData(ANode, DetailNode);
  182. end;
  183. function TrmXmjBGLDetailData.AssignData(
  184. AProjectData: TProjectData): TDataSet;
  185. begin
  186. FProjectData := AProjectData;
  187. FClassXmjList := TList.Create;
  188. cdsXmjBGLDetail.Active := True;
  189. cdsXmjBGLDetail.EmptyDataSet;
  190. cdsXmjBGLDetail.DisableControls;
  191. try
  192. FilterNode(AProjectData.BillsCompileData.BillsCompileTree.FirstNode);
  193. WriteData;
  194. finally
  195. cdsXmjBGLDetail.EnableControls;
  196. Result := cdsXmjBGLDetail;
  197. ClearObjects(FClassXmjList);
  198. FClassXmjList.Free;
  199. end;
  200. end;
  201. function TrmXmjBGLDetailData.CheckChildNodeHasBGL(
  202. ANode: TsdIDTreeNode): Boolean;
  203. var
  204. iNext, iTotal: Integer;
  205. vChild: TsdIDTreeNode;
  206. begin
  207. Result := False;
  208. if not Assigned(ANode) then Exit;
  209. iNext := 1;
  210. iTotal := ANode.PosterityCount;
  211. vChild := ANode.NextNode;
  212. while (iNext <= iTotal) and not Result do
  213. begin
  214. if not vChild.HasChildren then
  215. Result := CheckHasBGL(vChild);
  216. vChild := vChild.NextNode;
  217. Inc(iNext);
  218. end;
  219. end;
  220. function TrmXmjBGLDetailData.CheckHasBGL(ANode: TsdIDTreeNode): Boolean;
  221. var
  222. StageRec: TsdDataRecord;
  223. begin
  224. Result := False;
  225. StageRec := FProjectData.PhaseData.StageData.StageRecord(ANode.ID);
  226. if Assigned(StageRec) then
  227. Result := (StageRec.ValueByName('EndQcTotalPrice').AsFloat <> 0)
  228. or (StageRec.ValueByName('EndPcTotalPrice').AsFloat <> 0);
  229. end;
  230. function TrmXmjBGLDetailData.CheckLeafXmj(ANode: TsdIDTreeNode): Boolean;
  231. var
  232. i: Integer;
  233. begin
  234. Result := True;
  235. for i := 0 to ANode.ChildCount - 1 do
  236. begin
  237. if ANode.ChildNodes[i].Rec.ValueByName('B_Code').AsString = '' then
  238. begin
  239. Result := False;
  240. Break;
  241. end;
  242. end;
  243. end;
  244. procedure TrmXmjBGLDetailData.FilterBGLData(ANode: TsdIDTreeNode;
  245. AClassNode: TXmjNode);
  246. var
  247. i: Integer;
  248. begin
  249. if not Assigned(ANode) then Exit;
  250. if ANode.HasChildren then
  251. for i := 0 to ANode.ChildCount - 1 do
  252. FilterBGLData(ANode.ChildNodes[i], AClassNode)
  253. else
  254. FilterNodeBGLData(ANode, AClassNode);
  255. end;
  256. procedure TrmXmjBGLDetailData.FilterDetailNode(ANode: TsdIDTreeNode;
  257. AClassNode: TXmjNode);
  258. var
  259. i: Integer;
  260. begin
  261. if not Assigned(ANode) and (ANode.Level < 2) then Exit;
  262. if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
  263. if CheckLeafXmj(ANode) and CheckHasBGL(ANode) then
  264. AddDetailXmjNode(ANode, AClassNode);
  265. if ANode.HasChildren then
  266. begin
  267. for i := 0 to ANode.ChildCount - 1 do
  268. FilterDetailNode(ANode.ChildNodes[i], AClassNode);
  269. end;
  270. end;
  271. procedure TrmXmjBGLDetailData.FilterNode(ANode: TsdIDTreeNode);
  272. begin
  273. if not Assigned(ANode) then Exit;
  274. if ANode.Level> 1 then Exit;
  275. if ANode.Level = 0 then
  276. FilterNode(ANode.FirstChild)
  277. else if CheckHasBGL(ANode) then
  278. AddClassXmjNode(ANode);
  279. FilterNode(ANode.NextSibling);
  280. end;
  281. procedure TrmXmjBGLDetailData.FilterNodeBGLData(ANode: TsdIDTreeNode;
  282. AClassNode: TXmjNode);
  283. var
  284. StageRec: TsdDataRecord;
  285. begin
  286. StageRec := FProjectData.PhaseData.StageData.StageRecord(ANode.ID);
  287. if not Assigned(StageRec) then Exit;
  288. AddBGLsData(StageRec.ValueByName('EndQcBGLCode').AsString, AClassNode);
  289. AddBGLsData(StageRec.ValueByName('EndPcBGLCode').AsString, AClassNode);
  290. end;
  291. function TrmXmjBGLDetailData.GetDgnQuantity(ANum1, ANum2: Double): string;
  292. begin
  293. Result := '';
  294. if ANum1 <> 0 then
  295. begin
  296. Result := FloatToStr(ANum1);
  297. if ANum2 <> 0 then
  298. Result := Result + '/' + FloatToStr(ANum2);
  299. end;
  300. end;
  301. procedure TrmXmjBGLDetailData.WriteBGLNodeData(ABGLNode: TBGLNode);
  302. begin
  303. cdsXmjBGLDetail.Append;
  304. cdsXmjBGLDetailXmj_BGLName.AsString := ABGLNode.FBGLName;
  305. cdsXmjBGLDetailBGLCode.AsString := ABGLNode.FBGLCode;
  306. cdsXmjBGLDetailBGLName.AsString := ABGLNode.FBGLName;
  307. cdsXmjBGLDetailReason.AsString := ABGLNode.FBGLReason;
  308. cdsXmjBGLDetailDirection.AsString := ABGLNode.FDirection;
  309. cdsXmjBGLDetailDrawingCode.AsString := ABGLNode.FDrawingCode;
  310. cdsXmjBGLDetailApprovalCode.AsString := ABGLNode.FApprovalCode;
  311. cdsXmjBGLDetailBGLRelaFile.AsString := ABGLNode.FBGLRelaFile;
  312. cdsXmjBGLDetail.Post;
  313. end;
  314. procedure TrmXmjBGLDetailData.WriteData;
  315. var
  316. i: Integer;
  317. begin
  318. for i := 0 to FClassXmjList.Count - 1 do
  319. WriteXmjNodeData(TXmjNode(FClassXmjList.Items[i]));
  320. end;
  321. procedure TrmXmjBGLDetailData.WriteXmjNodeData(AXmjNode: TXmjNode;
  322. AIndex: Integer);
  323. var
  324. i: Integer;
  325. begin
  326. cdsXmjBGLDetail.Append;
  327. if AIndex = -1 then
  328. cdsXmjBGLDetailCode.AsString := AXmjNode.FCode
  329. else
  330. cdsXmjBGLDetailCode.AsString := IntToStr(AIndex + 1);
  331. cdsXmjBGLDetailName.AsString := AXmjNode.FName;
  332. cdsXmjBGLDetailDgnQuantity1.AsFloat := AXmjNode.FDgnQuantity1;
  333. cdsXmjBGLDetailDgnQuantity2.AsFloat := AXmjNode.FDgnQuantity2;
  334. cdsXmjBGLDetailDgnQuantity.AsString := GetDgnQuantity(AXmjNode.FDgnQuantity1, AXmjNode.FDgnQuantity2);
  335. cdsXmjBGLDetailEndDealTotalPrice.AsFloat := AXmjNode.FEndDealTotalPrice;
  336. cdsXmjBGLDetailEndGatherTotalPrice.AsFloat := AXmjNode.FEndGatherTotalPrice;
  337. cdsXmjBGLDetailBGTotalPrice.AsFloat := AXmjNode.FEndGatherTotalPrice - AXmjNode.FEndDealTotalPrice;
  338. cdsXmjBGLDetailTotalPrice.AsFloat := AXmjNode.FTotalPrice;
  339. cdsXmjBGLDetailEndQcTotalPrice.AsFloat := AXmjNode.FEndQcTotalPrice;
  340. cdsXmjBGLDetailFinalTotalPrice.AsFloat := AXmjNode.FTotalPrice + AXmjNode.FEndQcTotalPrice;
  341. cdsXmjBGLDetailXmj_BGLName.AsString := AXmjNode.FName;
  342. cdsXmjBGLDetail.Post;
  343. for i := 0 to AXmjNode.BGLCount - 1 do
  344. WriteBGLNodeData(AXmjNode.BGLNode[i]);
  345. for i := 0 to AXmjNode.ChildCount - 1 do
  346. WriteXmjNodeData(AXmjNode.ChildNode[i], i);
  347. end;
  348. { TXmjNode }
  349. constructor TXmjNode.Create;
  350. begin
  351. FChildList := TList.Create;
  352. FBGLList := TList.Create;
  353. end;
  354. destructor TXmjNode.Destroy;
  355. begin
  356. ClearObjects(FBGLList);
  357. FBGLList.Free;
  358. ClearObjects(FChildList);
  359. FChildList.Free;
  360. inherited;
  361. end;
  362. function TXmjNode.FindBGLNode(const ABGLCode: string): TBGLNode;
  363. var
  364. i: Integer;
  365. begin
  366. Result := nil;
  367. for i := 0 to BGLCount - 1 do
  368. begin
  369. if BGLNode[i].FBGLCode = ABGLCode then
  370. begin
  371. Result := BGLNode[i];
  372. Break;
  373. end;
  374. end;
  375. end;
  376. function TXmjNode.GetBGLCount: Integer;
  377. begin
  378. Result := FBGLList.Count;
  379. end;
  380. function TXmjNode.GetBGLNode(AIndex: Integer): TBGLNode;
  381. begin
  382. Result := TBGLNode(FBGLList.Items[AIndex]);
  383. end;
  384. function TXmjNode.GetChildCount: Integer;
  385. begin
  386. Result := FChildList.Count;
  387. end;
  388. function TXmjNode.GetChildNode(AIndex: Integer): TXmjNode;
  389. begin
  390. Result := TXmjNode(FChildList.Items[AIndex]);
  391. end;
  392. end.