rmBillsPhaseGatherDm.pas 11 KB

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