rmDealInfosDm.pas 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. unit rmDealInfosDm;
  2. interface
  3. uses
  4. SysUtils, Classes, DB, DBClient, rmSelectProjectFrm, ProjectData,
  5. ZhAPI, sdDB, sdIDTree;
  6. type
  7. TInfoNode = class
  8. private
  9. // 合同类别
  10. FDealType: string;
  11. // 合同编号
  12. FDealCode: string;
  13. // 结算书编号
  14. FBalanceCode: string;
  15. // 合同名称
  16. FDealName: string;
  17. // 签订单位
  18. FDealCompany: string;
  19. // 合同金额
  20. FDealTotalPrice: Double;
  21. // 结算金额
  22. FFinalTotalPrice: Double;
  23. // 累计应扣款
  24. FCutTotalPrice: Double;
  25. // 累计已支付
  26. FPaidTotalPrice: Double;
  27. // 签约合同价 (单合同:取项目属性签约合同价,多合同:取0号台账合同)
  28. FContractPrice: Double;
  29. public
  30. constructor Create;
  31. end;
  32. TrmDealInfosData = class(TDataModule)
  33. cdsDealInfos: TClientDataSet;
  34. cdsDealInfosDealType: TWideStringField;
  35. cdsDealInfosDealCode: TWideStringField;
  36. cdsDealInfosDealCompany: TWideStringField;
  37. cdsDealInfosDealTotalPrice: TFloatField;
  38. cdsDealInfosFinalTotalPrice: TFloatField;
  39. cdsDealInfosCutTotalPrice: TFloatField;
  40. cdsDealInfosPayTotalPrice: TFloatField;
  41. cdsDealInfosPaidTotalPrice: TFloatField;
  42. cdsDealInfosPayingTotalPrice: TFloatField;
  43. cdsDealInfosMemoStr: TWideStringField;
  44. cdsDealInfosBalanceCode: TWideStringField;
  45. cdsDealInfosDealName: TWideStringField;
  46. cdsDealInfosPayPercent: TFloatField;
  47. cdsDealInfosContractPrice: TFloatField;
  48. private
  49. FDealInfos: TList;
  50. FTotalDealInfo: TInfoNode;
  51. FProjectData: TProjectData;
  52. procedure BeforeGather;
  53. procedure AfterGather;
  54. procedure OpenProjectData(AProjectID: Integer);
  55. procedure FreeProjectData;
  56. procedure AddBillsDealInfo(ANode: TsdIDTreeNode);
  57. procedure AddBillsDeal(ANode: TsdIDTreeNode);
  58. // 标段为合同
  59. procedure AddDealProjectInfo(AProjectID: Integer);
  60. // 标段内含多个合同
  61. procedure AddProjectDealInfos(AProjectID: Integer);
  62. procedure AddDealInfo(AProject: TSelectProject);
  63. procedure GatherTotalDealInfo;
  64. procedure WriteDealInfoData;
  65. public
  66. function AssignData(AProjects: TList): TDataSet;
  67. end;
  68. implementation
  69. uses ProjectProperty, Globals, UtilMethods;
  70. {$R *.dfm}
  71. { TrmDealInfosData }
  72. procedure TrmDealInfosData.AddBillsDeal(ANode: TsdIDTreeNode);
  73. begin
  74. if not Assigned(ANode) then Exit;
  75. if ANode.Rec.ValueByName('DealCode').AsString <> '' then
  76. AddBillsDealInfo(ANode);
  77. AddBillsDeal(ANode.FirstChild);
  78. AddBillsDeal(ANode.NextSibling);
  79. end;
  80. procedure TrmDealInfosData.AddBillsDealInfo(ANode: TsdIDTreeNode);
  81. var
  82. DealInfo: TInfoNode;
  83. begin
  84. DealInfo := TInfoNode.Create;
  85. FDealInfos.Add(DealInfo);
  86. DealInfo.FDealType := ANode.Rec.ValueByName('DealType').AsString;
  87. DealInfo.FDealCode := ANode.Rec.ValueByName('DealCode').AsString;
  88. DealInfo.FDealName := ANode.Rec.ValueByName('Name').AsString;
  89. DealInfo.FDealCompany := ANode.Rec.ValueByName('DealCompany').AsString;
  90. DealInfo.FDealTotalPrice := ANode.Rec.ValueByName('TotalPrice').AsFloat;
  91. DealInfo.FFinalTotalPrice := ANode.Rec.ValueByName('AddGatherTotalPrice').AsFloat;
  92. DealInfo.FCutTotalPrice := ANode.Rec.ValueByName('AddCutTotalPrice').AsFloat;
  93. DealInfo.FPaidTotalPrice := ANode.Rec.ValueByName('AddPayTotalPrice').AsFloat;
  94. DealInfo.FContractPrice := ANode.Rec.ValueByName('TotalPrice').AsFloat;
  95. end;
  96. procedure TrmDealInfosData.AddDealInfo(AProject: TSelectProject);
  97. begin
  98. if AProject.IsDeal then
  99. AddProjectDealInfos(AProject.ProjectID)
  100. else
  101. AddDealProjectInfo(AProject.ProjectID);
  102. end;
  103. procedure TrmDealInfosData.AddDealProjectInfo(AProjectID: Integer);
  104. var
  105. DealInfo: TInfoNode;
  106. begin
  107. OpenProjectData(AProjectID);
  108. try
  109. DealInfo := TInfoNode.Create;
  110. FDealInfos.Add(DealInfo);
  111. DealInfo.FDealType := FProjectData.ProjProperties.DealType;
  112. DealInfo.FDealCode := FProjectData.ProjProperties.DealIndex;
  113. DealInfo.FDealName := FProjectData.ProjProperties.DealName;
  114. DealInfo.FDealCompany := FProjectData.ProjProperties.CName;
  115. // Bug #674 要求修改为取项目属性界面签约合同价
  116. DealInfo.FDealTotalPrice := FProjectData.BillsData.Settlement[0];
  117. DealInfo.FFinalTotalPrice := FProjectData.DealPaymentData.AddTotalPrice;
  118. DealInfo.FCutTotalPrice := FProjectData.DealPaymentData.CutTotalPrice;
  119. DealInfo.FPaidTotalPrice := FProjectData.DealPaymentData.PaidTotalPrice;
  120. DealInfo.FContractPrice := FProjectData.ProjProperties.ContractPrice;
  121. finally
  122. FreeProjectData;
  123. end;
  124. end;
  125. procedure TrmDealInfosData.AddProjectDealInfos(AProjectID: Integer);
  126. begin
  127. OpenProjectData(AProjectID);
  128. try
  129. AddBillsDeal(FProjectData.BillsCompileData.BillsCompileTree.FirstNode);
  130. finally
  131. FreeProjectData;
  132. end;
  133. end;
  134. procedure TrmDealInfosData.AfterGather;
  135. begin
  136. FTotalDealInfo.Free;
  137. ClearObjects(FDealInfos);
  138. FDealInfos.Free;
  139. cdsDealInfos.EnableControls;
  140. end;
  141. function TrmDealInfosData.AssignData(AProjects: TList): TDataSet;
  142. var
  143. iProject: Integer;
  144. begin
  145. BeforeGather;
  146. try
  147. for iProject := 0 to AProjects.Count - 1 do
  148. AddDealInfo(TSelectProject(AProjects.Items[iProject]));
  149. GatherTotalDealInfo;
  150. WriteDealInfoData;
  151. finally
  152. AfterGather;
  153. Result := cdsDealInfos;
  154. end;
  155. end;
  156. procedure TrmDealInfosData.BeforeGather;
  157. begin
  158. cdsDealInfos.DisableControls;
  159. cdsDealInfos.Active := True;
  160. cdsDealInfos.EmptyDataSet;
  161. FDealInfos := TList.Create;
  162. FTotalDealInfo := TInfoNode.Create;
  163. FTotalDealInfo.FDealType := '合计';
  164. end;
  165. procedure TrmDealInfosData.FreeProjectData;
  166. begin
  167. if not Assigned(OpenProjectManager.FindProjectData(FProjectData.ProjectID)) then
  168. FProjectData.Free;
  169. end;
  170. procedure TrmDealInfosData.GatherTotalDealInfo;
  171. var
  172. i: Integer;
  173. DealInfo: TInfoNode;
  174. begin
  175. for i := 0 to FDealInfos.Count - 1 do
  176. begin
  177. DealInfo := TInfoNode(FDealInfos.Items[i]);
  178. FTotalDealInfo.FDealTotalPrice := FTotalDealInfo.FDealTotalPrice + DealInfo.FDealTotalPrice;
  179. FTotalDealInfo.FFinalTotalPrice := FTotalDealInfo.FFinalTotalPrice + DealInfo.FFinalTotalPrice;
  180. FTotalDealInfo.FCutTotalPrice := FTotalDealInfo.FCutTotalPrice + DealInfo.FCutTotalPrice;
  181. FTotalDealInfo.FPaidTotalPrice := FTotalDealInfo.FPaidTotalPrice + DealInfo.FPaidTotalPrice;
  182. FTotalDealInfo.FContractPrice := FTotalDealInfo.FContractPrice + DealInfo.FContractPrice;
  183. end;
  184. end;
  185. procedure TrmDealInfosData.OpenProjectData(AProjectID: Integer);
  186. var
  187. Rec: TsdDataRecord;
  188. begin
  189. FProjectData := OpenProjectManager.FindProjectData(AProjectID);
  190. Rec := ProjectManager.sddProjectsInfo.FindKey('idxID', AProjectID);
  191. if not Assigned(FProjectData) then
  192. begin
  193. FProjectData := TProjectData.Create;
  194. FProjectData.OpenForReport(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString);
  195. end;
  196. end;
  197. procedure TrmDealInfosData.WriteDealInfoData;
  198. procedure WriteInfoNodeData(AInfo: TInfoNode);
  199. begin
  200. cdsDealInfos.Append;
  201. cdsDealInfosDealType.AsString := AInfo.FDealType;
  202. cdsDealInfosDealCode.AsString := AInfo.FDealCode;
  203. cdsDealInfosBalanceCode.AsString := AInfo.FBalanceCode;
  204. cdsDealInfosDealName.AsString := AInfo.FDealName;
  205. cdsDealInfosDealCompany.AsString := AInfo.FDealCompany;
  206. cdsDealInfosDealTotalPrice.AsFloat := AInfo.FDealTotalPrice;
  207. cdsDealInfosFinalTotalPrice.AsFloat := AInfo.FFinalTotalPrice;
  208. cdsDealInfosCutTotalPrice.AsFloat := AInfo.FCutTotalPrice;
  209. cdsDealInfosPayTotalPrice.AsFloat := AInfo.FFinalTotalPrice - AInfo.FCutTotalPrice;
  210. cdsDealInfosPaidTotalPrice.AsFloat := AInfo.FPaidTotalPrice;
  211. cdsDealInfosPayingTotalPrice.AsFloat := AInfo.FFinalTotalPrice - AInfo.FCutTotalPrice - AInfo.FPaidTotalPrice;
  212. if cdsDealInfosPayTotalPrice.AsFloat <> 0 then
  213. cdsDealInfosPayPercent.AsFloat := AdvRoundTo(
  214. cdsDealInfosPaidTotalPrice.AsFloat/cdsDealInfosPayTotalPrice.AsFloat*100);
  215. cdsDealInfosContractPrice.AsFloat := AInfo.FContractPrice;
  216. cdsDealInfos.Post;
  217. end;
  218. var
  219. i: Integer;
  220. begin
  221. for i := 0 to FDealInfos.Count - 1 do
  222. WriteInfoNodeData(TInfoNode(FDealInfos.Items[i]));
  223. WriteInfoNodeData(FTotalDealInfo);
  224. end;
  225. { TInfoNode }
  226. constructor TInfoNode.Create;
  227. begin
  228. FDealTotalPrice := 0;
  229. FFinalTotalPrice := 0;
  230. FCutTotalPrice := 0;
  231. FPaidTotalPrice := 0;
  232. FContractPrice := 0;
  233. end;
  234. end.