rmBillsPhaseGatherDm.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. unit rmBillsPhaseGatherDm;
  2. interface
  3. uses
  4. SysUtils, Classes, DB, DBClient, sdDB, sdIDTree,
  5. ProjectData, MCacheTree, BillsTree, mDataRecord,
  6. rmSelectProjectFrm;
  7. type
  8. TrmBillsPhaseGatherData = class(TDataModule)
  9. cdsZjtzBills: TClientDataSet;
  10. cdsZjtzBillsID: TIntegerField;
  11. cdsZjtzBillsParentID: TIntegerField;
  12. cdsZjtzBillsNextSiblingID: TIntegerField;
  13. cdsZjtzBillsCode: TWideStringField;
  14. cdsZjtzBillsName: TWideStringField;
  15. cdsZjtzBillsUnits: TWideStringField;
  16. cdsZjtzBillscbDgnQty1: TFloatField;
  17. cdsZjtzBillscbDgnQty2: TFloatField;
  18. cdsZjtzBillscbDgnQty: TStringField;
  19. cdsZjtzBillscbTotalPrice: TFloatField;
  20. cdsZjtzBillssscDgnQty1: TFloatField;
  21. cdsZjtzBillssscDgnQty2: TFloatField;
  22. cdsZjtzBillssscDgnQty: TStringField;
  23. cdsZjtzBillssscTotalPrice: TFloatField;
  24. cdsZjtzBillsshtDgnQty1: TFloatField;
  25. cdsZjtzBillsshtDgnQty2: TFloatField;
  26. cdsZjtzBillsshtDgnQty: TStringField;
  27. cdsZjtzBillsshtTotalPrice: TFloatField;
  28. cdsZjtzBillshtDgnQty1: TFloatField;
  29. cdsZjtzBillshtDgnQty2: TFloatField;
  30. cdsZjtzBillshtDgnQty: TStringField;
  31. cdsZjtzBillsTotalPrice: TFloatField;
  32. cdsZjtzBillsbgDgnQty1: TFloatField;
  33. cdsZjtzBillsbgDgnQty2: TFloatField;
  34. cdsZjtzBillsbgDgnQty: TStringField;
  35. cdsZjtzBillsEndQcTotalPrice: TFloatField;
  36. cdsZjtzBillsEndDealTotalPrice: TFloatField;
  37. cdsZjtzBillsMemoStr: TWideStringField;
  38. cdsZjtzBillssumDgnQty1: TFloatField;
  39. cdsZjtzBillssumDgnQty2: TFloatField;
  40. cdsZjtzBillssumDgnQty: TStringField;
  41. cdsZjtzBillsDgnQty1: TFloatField;
  42. cdsZjtzBillsDgnQty2: TFloatField;
  43. cdsZjtzBillsDgnQty: TStringField;
  44. cdsZjtzBillsDgnQtyA1: TFloatField;
  45. cdsZjtzBillsDgnQtyA2: TFloatField;
  46. cdsZjtzBillsDgnQtyA: TStringField;
  47. private
  48. FCacheTree: TSpecPhaseCacheTree;
  49. FProjectData: TProjectData;
  50. function GetDgnQuantity(ANum1, ANum2: Double): string;
  51. procedure BeforeGather;
  52. procedure AfterGather;
  53. procedure OpenProject(AProject: TSelectProject);
  54. procedure FreeProject;
  55. function AddBillsNode(ANode: TBillsIDTreeNode;
  56. AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
  57. function AddSpecBillsNode(ANode: TsdIDTreeNode; AParent: TSpecPhaseCacheNode;
  58. ASelectProject: TSelectProject): TSpecPhaseCacheNode;
  59. function AddSpecBills(ANode: TsdIDTreeNode; AParent: TSpecPhaseCacheNode;
  60. ASelectProject: TSelectProject): TSpecPhaseCacheNode;
  61. function AddPhaseBillsNode(ANode: TsdIDTreeNode;
  62. AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
  63. function AddPhaseBills(ANode: TsdIDTreeNode;
  64. AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
  65. procedure GatherProject(AProject: TSelectProject);
  66. procedure WriteNode(ANode: TSpecPhaseCacheNode);
  67. procedure WriteData;
  68. public
  69. function AssignData(AProjects: TList): TDataSet;
  70. end;
  71. implementation
  72. uses CacheTree, Globals, UtilMethods;
  73. {$R *.dfm}
  74. { TrmBillsPhaseGatherData }
  75. function TrmBillsPhaseGatherData.AddBillsNode(ANode: TBillsIDTreeNode;
  76. AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
  77. var
  78. Rec: TBillsRecord;
  79. iGatherCompare: Integer;
  80. ANextSibling: TSpecPhaseCacheNode;
  81. begin
  82. Rec := ANode.Rec;
  83. if Rec.B_Code.AsString <> '' then
  84. iGatherCompare := ReportConfig.GclCompare
  85. else
  86. iGatherCompare := ReportConfig.XmjCompare;
  87. case iGatherCompare of
  88. // 按编号
  89. 0: if (Rec.Code.asString <> '') or (Rec.B_Code.asString <> '') then
  90. Result := FCacheTree.FindNode(AParent, Rec.Code.AsString, Rec.B_Code.AsString)
  91. else
  92. Result := FCacheTree.FindNode(AParent, Rec.Name.AsString);
  93. // 按名称
  94. 1: Result := FCacheTree.FindNode(AParent, Rec.Name.AsString);
  95. // 按编号+名称
  96. 2: Result := FCacheTree.FindNode(AParent, Rec.Code.AsString,
  97. Rec.B_Code.AsString, Rec.Name.AsString);
  98. end;
  99. if not Assigned(Result) then
  100. begin
  101. ANextSibling := FCacheTree.FindNextSibling(AParent,
  102. Rec.Code.AsString, Rec.B_Code.AsString);
  103. Result := FCacheTree.AddNode(AParent, ANextSibling);
  104. Result.Code := Rec.Code.AsString;
  105. Result.B_Code := Rec.B_Code.AsString;
  106. Result.Name := Rec.Name.AsString;
  107. Result.Units := Rec.Units.AsString;
  108. end;
  109. end;
  110. function TrmBillsPhaseGatherData.AddPhaseBills(ANode: TsdIDTreeNode;
  111. AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
  112. begin
  113. if not Assigned(ANode) then Exit;
  114. // 按设置的层次汇总(Level从0开始取值)
  115. case ReportConfig.GatherLevel of
  116. // 项
  117. 0: if ANode.Level > 1 then Exit;
  118. // 目
  119. 1: if ANode.Level > 2 then Exit;
  120. // 节
  121. 2: if ANode.Level > 3 then Exit;
  122. // 细目
  123. 3: if ANode.Level > 4 then Exit;
  124. // 项目节
  125. 4: if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
  126. end;
  127. if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
  128. Result := AddPhaseBillsNode(ANode, AParent);
  129. AddPhaseBills(ANode.FirstChild, Result);
  130. AddPhaseBills(ANode.NextSibling, AParent);
  131. end;
  132. function TrmBillsPhaseGatherData.AddPhaseBillsNode(ANode: TsdIDTreeNode;
  133. AParent: TSpecPhaseCacheNode): TSpecPhaseCacheNode;
  134. var
  135. vNode: TMeasureBillsIDTreeNode;
  136. Rec: TBillsRecord;
  137. StageRec: TStageRecord;
  138. begin
  139. vNode := TMeasureBillsIDTreeNode(ANode);
  140. Result := AddBillsNode(vNode, AParent);
  141. Rec := vNode.Rec;
  142. Result.DgnQty1 := Result.DgnQty1 + Rec.DgnQuantity1.AsFloat;
  143. Result.DgnQty2 := Result.DgnQty2 + Rec.DgnQuantity2.AsFloat;
  144. Result.TotalPrice := Result.TotalPrice + Rec.TotalPrice.AsFloat;
  145. Result.htDgnQty1 := Result.htDgnQty1 + Rec.DealDgnQuantity1.AsFloat;
  146. Result.htDgnQty2 := Result.htDgnQty2 + Rec.DealDgnQuantity2.AsFloat;
  147. Result.bgDgnQty1 := Result.bgDgnQty1 + Rec.CDgnQuantity1.AsFloat;
  148. Result.bgDgnQty2 := Result.bgDgnQty2 + Rec.CDgnQuantity2.AsFloat;
  149. StageRec := vNode.StageRec;
  150. if Assigned(StageRec) then
  151. begin
  152. Result.EndDealTotalPrice := Result.EndDealTotalPrice + StageRec.EndDealTotalPrice.AsFloat;
  153. Result.EndQcTotalPrice := Result.EndQcTotalPrice + StageRec.EndQcTotalPrice.AsFloat;
  154. end;
  155. end;
  156. function TrmBillsPhaseGatherData.AddSpecBills(ANode: TsdIDTreeNode;
  157. AParent: TSpecPhaseCacheNode; ASelectProject: TSelectProject): TSpecPhaseCacheNode;
  158. begin
  159. if not Assigned(ANode) then Exit;
  160. // 按设置的层次汇总(Level从0开始取值)
  161. case ReportConfig.GatherLevel of
  162. // 项
  163. 0: if ANode.Level > 1 then Exit;
  164. // 目
  165. 1: if ANode.Level > 2 then Exit;
  166. // 节
  167. 2: if ANode.Level > 3 then Exit;
  168. // 细目
  169. 3: if ANode.Level > 4 then Exit;
  170. // 项目节
  171. 4: if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
  172. end;
  173. if ANode.Rec.ValueByName('B_Code').AsString <> '' then Exit;
  174. Result := AddSpecBillsNode(ANode, AParent, ASelectProject);
  175. AddSpecBills(ANode.FirstChild, Result, ASelectProject);
  176. AddSpecBills(ANode.NextSibling, AParent, ASelectProject);
  177. end;
  178. function TrmBillsPhaseGatherData.AddSpecBillsNode(ANode: TsdIDTreeNode;
  179. AParent: TSpecPhaseCacheNode;
  180. ASelectProject: TSelectProject): TSpecPhaseCacheNode;
  181. var
  182. vNode: TBillsIDTreeNode;
  183. Rec: TBillsRecord;
  184. begin
  185. vNode := TBillsIDTreeNode(ANode);
  186. Result := AddBillsNode(vNode, AParent);
  187. Rec := vNode.Rec;
  188. if ASelectProject.IsPD then
  189. begin
  190. Result.cbDgnQty1 := Rec.DgnQuantity1.AsFloat;
  191. Result.cbDgnQty2 := Rec.DgnQuantity2.AsFloat;
  192. Result.cbTotalPrice := Rec.TotalPrice.AsFloat;
  193. end
  194. else if ASelectProject.IsCddSc then
  195. begin
  196. Result.sscDgnQty1 := Rec.DgnQuantity1.AsFloat;
  197. Result.sscDgnQty2 := Rec.DgnQuantity2.AsFloat;
  198. Result.sscTotalPrice := Rec.TotalPrice.AsFloat;
  199. end
  200. else if ASelectProject.IsCddHt then
  201. begin
  202. Result.shtDgnQty1 := Rec.DgnQuantity1.AsFloat;
  203. Result.shtDgnQty2 := Rec.DgnQuantity2.AsFloat;
  204. Result.shtTotalPrice := Rec.TotalPrice.AsFloat;
  205. end;
  206. end;
  207. procedure TrmBillsPhaseGatherData.AfterGather;
  208. begin
  209. cdsZjtzBills.EnableControls;
  210. FCacheTree.Free;
  211. end;
  212. function TrmBillsPhaseGatherData.AssignData(AProjects: TList): TDataSet;
  213. var
  214. iProject: Integer;
  215. begin
  216. BeforeGather;
  217. try
  218. for iProject := 0 to AProjects.Count - 1 do
  219. GatherProject(AProjects[iProject]);
  220. WriteData;
  221. finally
  222. Result := cdsZjtzBills;
  223. AfterGather;
  224. end;
  225. end;
  226. procedure TrmBillsPhaseGatherData.BeforeGather;
  227. begin
  228. FCacheTree := TSpecPhaseCacheTree.Create;
  229. cdsZjtzBills.DisableControls;
  230. cdsZjtzBills.Active := True;
  231. cdsZjtzBills.EmptyDataSet;
  232. end;
  233. procedure TrmBillsPhaseGatherData.FreeProject;
  234. begin
  235. if not Assigned(OpenProjectManager.FindProjectData(FProjectData.ProjectID)) then
  236. FProjectData.Free;
  237. end;
  238. procedure TrmBillsPhaseGatherData.GatherProject(AProject: TSelectProject);
  239. begin
  240. OpenProject(AProject);
  241. try
  242. if AProject.IsPD or AProject.IsCddSc or AProject.IsCddHt then
  243. AddSpecBills(FProjectData.BillsCompileData.BillsCompileTree.FirstNode, nil, AProject)
  244. else
  245. AddPhaseBills(FProjectData.BillsMeasureData.BillsMeasureTree.FirstNode, nil);
  246. finally
  247. FreeProject;
  248. end;
  249. end;
  250. function TrmBillsPhaseGatherData.GetDgnQuantity(ANum1,
  251. ANum2: Double): string;
  252. begin
  253. Result := '';
  254. if ANum1 <> 0 then
  255. begin
  256. Result := FloatToStr(ANum1);
  257. if ANum2 <> 0 then
  258. Result := Result + '/' + FloatToStr(ANum2);
  259. end;
  260. end;
  261. procedure TrmBillsPhaseGatherData.OpenProject(AProject: TSelectProject);
  262. var
  263. Rec: TsdDataRecord;
  264. begin
  265. FProjectData := OpenProjectManager.FindProjectData(AProject.ProjectID);
  266. if not Assigned(FProjectData) then
  267. begin
  268. Rec := ProjectManager.sddProjectsInfo.FindKey('idxID', AProject.ProjectID);
  269. FProjectData := TProjectData.Create;
  270. if AProject.IsPD or AProject.IsCddSc or AProject.IsCddHt then
  271. FProjectData.OpenForReport(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString)
  272. else
  273. FProjectData.OpenForReport3(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString);
  274. end;
  275. end;
  276. procedure TrmBillsPhaseGatherData.WriteData;
  277. begin
  278. WriteNode(TSpecPhaseCacheNode(FCacheTree.FirstNode));
  279. end;
  280. procedure TrmBillsPhaseGatherData.WriteNode(ANode: TSpecPhaseCacheNode);
  281. begin
  282. if not Assigned(ANode) then Exit;
  283. cdsZjtzBills.Append;
  284. cdsZjtzBillsID.AsInteger := ANode.ID;
  285. cdsZjtzBillsParentID.AsInteger := ANode.ParentID;
  286. cdsZjtzBillsNextSiblingID.AsInteger := ANode.NextSiblingID;
  287. cdsZjtzBillsCode.AsString := ANode.Code;
  288. cdsZjtzBillsName.AsString := ANode.Name;
  289. cdsZjtzBillsUnits.AsString := ANode.Units;
  290. cdsZjtzBillscbDgnQty1.AsFloat := ANode.cbDgnQty1;
  291. cdsZjtzBillscbDgnQty2.AsFloat := ANode.cbDgnQty2;
  292. cdsZjtzBillscbDgnQty.AsString := GetDgnQuantity(ANode.cbDgnQty1, ANode.cbDgnQty2);
  293. cdsZjtzBillscbTotalPrice.AsFloat := ANode.cbTotalPrice;
  294. cdsZjtzBillssscDgnQty1.AsFloat := ANode.sscDgnQty1;
  295. cdsZjtzBillssscDgnQty2.AsFloat := ANode.sscDgnQty2;
  296. cdsZjtzBillssscDgnQty.AsString := GetDgnQuantity(ANode.sscDgnQty1, ANode.sscDgnQty2);
  297. cdsZjtzBillssscTotalPrice.AsFloat := ANode.sscTotalPrice;
  298. cdsZjtzBillsshtDgnQty1.AsFloat := ANode.shtDgnQty1;
  299. cdsZjtzBillsshtDgnQty2.AsFloat := ANode.shtDgnQty2;
  300. cdsZjtzBillsshtDgnQty.AsString := GetDgnQuantity(ANode.shtDgnQty1, ANode.shtDgnQty2);
  301. cdsZjtzBillsshtTotalPrice.AsFloat := ANode.shtTotalPrice;
  302. cdsZjtzBillsDgnQty1.AsFloat := ANode.DgnQty1;
  303. cdsZjtzBillsDgnQty2.AsFloat := ANode.DgnQty2;
  304. cdsZjtzBillsDgnQty.AsString := GetDgnQuantity(ANode.DgnQty1, ANode.DgnQty2);
  305. cdsZjtzBillsTotalPrice.AsFloat := ANode.TotalPrice;
  306. cdsZjtzBillshtDgnQty1.AsFloat := ANode.htDgnQty1;
  307. cdsZjtzBillshtDgnQty2.AsFloat := ANode.htDgnQty2;
  308. cdsZjtzBillshtDgnQty.AsString := GetDgnQuantity(ANode.htDgnQty1, ANode.htDgnQty2);
  309. cdsZjtzBillsbgDgnQty1.AsFloat := ANode.bgDgnQty1;
  310. cdsZjtzBillsbgDgnQty2.AsFloat := ANode.bgDgnQty2;
  311. cdsZjtzBillsbgDgnQty.AsString := GetDgnQuantity(ANode.bgDgnQty1, ANode.bgDgnQty2);
  312. cdsZjtzBillsEndQcTotalPrice.AsFloat := ANode.EndQcTotalPrice;
  313. cdsZjtzBillsEndDealTotalPrice.AsFloat := ANode.EndDealTotalPrice;
  314. cdsZjtzBillssumDgnQty1.AsFloat := ANode.htDgnQty1 + ANode.bgDgnQty1;
  315. cdsZjtzBillssumDgnQty2.AsFloat := ANode.htDgnQty2 + ANode.bgDgnQty2;
  316. cdsZjtzBillssumDgnQty.AsString := GetDgnQuantity(cdsZjtzBillssumDgnQty1.AsFloat, cdsZjtzBillssumDgnQty2.AsFloat);
  317. cdsZjtzBillsDgnQtyA1.AsFloat := ANode.DgnQty1 + ANode.bgDgnQty1;
  318. cdsZjtzBillsDgnQtyA2.AsFloat := ANode.DgnQty2 + ANode.bgDgnQty2;
  319. cdsZjtzBillsDgnQtyA.AsString := GetDgnQuantity(cdsZjtzBillsDgnQtyA1.AsFloat, cdsZjtzBillsDgnQtyA2.AsFloat);
  320. cdsZjtzBills.Post;
  321. WriteNode(TSpecPhaseCacheNode(ANode.FirstChild));
  322. WriteNode(TSpecPhaseCacheNode(ANode.NextSibling));
  323. end;
  324. end.