rmWuJiuZqzfGatherDm.pas 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. unit rmWuJiuZqzfGatherDm;
  2. interface
  3. uses
  4. SysUtils, Classes, DB, DBClient, ProjectData, sdIDTree, sdDB;
  5. type
  6. TrmWuJiuZqzfGatherData = class(TDataModule)
  7. cdsZqzf: TClientDataSet;
  8. cdsZqzfPhaseIndex: TIntegerField;
  9. cdsZqzfQyht: TFloatField;
  10. cdsZqzfFhqd: TFloatField;
  11. cdsZqzfBg: TFloatField;
  12. cdsZqzfSp: TFloatField;
  13. cdsZqzfWy: TFloatField;
  14. cdsZqzfCljg: TFloatField;
  15. cdsZqzfBgh: TFloatField;
  16. cdsZqzfEndGather: TFloatField;
  17. cdsZqzfPreGather: TFloatField;
  18. cdsZqzfCurGather: TFloatField;
  19. cdsZqzfAddKhBlj: TFloatField;
  20. cdsZqzfCurKhBlj: TFloatField;
  21. cdsZqzfAddKhNmggz: TFloatField;
  22. cdsZqzfCurKhNmggz: TFloatField;
  23. cdsZqzfDyyfk: TFloatField;
  24. cdsZqzfAddKhDyyfk: TFloatField;
  25. cdsZqzfCurKhDyyfk: TFloatField;
  26. cdsZqzfAddKAddedTax: TFloatField;
  27. cdsZqzfCurKAddedTax: TFloatField;
  28. cdsZqzfAddSjzf: TFloatField;
  29. cdsZqzfCurSjzf: TFloatField;
  30. cdsZqzfMemo: TWideStringField;
  31. private
  32. FQyht: Double;
  33. FFhqd: Double;
  34. FBg: Double;
  35. FSp: Double;
  36. FWy: Double;
  37. FCljg: Double;
  38. procedure GatherMainData(AProjectData: TProjectData);
  39. procedure LoadPhaseData(APhaseIndex: Integer; AProjectData: TProjectData = nil);
  40. public
  41. function AssignData(AProjectData: TProjectData): TDataSet;
  42. end;
  43. implementation
  44. uses BillsDm, BGLDm, DealPaymentDm, PhaseData, PhasePayDm, ConstUnit;
  45. {$R *.dfm}
  46. { TrmWuJiuZqzfGatherData }
  47. function TrmWuJiuZqzfGatherData.AssignData(
  48. AProjectData: TProjectData): TDataSet;
  49. var
  50. iPhase: Integer;
  51. begin
  52. cdsZqzf.Active := True;
  53. cdsZqzf.EmptyDataSet;
  54. GatherMainData(AProjectData);
  55. for iPhase := 1 to AProjectData.ProjProperties.PhaseCount do
  56. LoadPhaseData(iPhase, AProjectData);
  57. Result := cdsZqzf;
  58. end;
  59. procedure TrmWuJiuZqzfGatherData.GatherMainData(AProjectData: TProjectData);
  60. function FindChild(const AName: String; AParent: TsdIDTreeNode = nil): TsdIDTreeNode;
  61. var
  62. vNode: TsdIDTreeNode;
  63. begin
  64. Result := nil;
  65. if Assigned(AParent) then
  66. vNode := AParent.FirstChild
  67. else
  68. vNode := AProjectData.BillsCompileData.BillsCompileTree.FirstNode;
  69. while Assigned(vNode) do
  70. begin
  71. if Pos(AName, vNode.Rec.ValueByName('Name').AsString) > 0 then
  72. begin
  73. Result := vNode;
  74. Break;
  75. end
  76. else
  77. vNode := vNode.NextSibling;
  78. end;
  79. end;
  80. function FindNode(const AName: String; AParent: TsdIDTreeNode = nil): TsdIDTreeNode;
  81. var
  82. vNode: TsdIDTreeNode;
  83. i, iCount: Integer;
  84. begin
  85. Result := nil;
  86. i := 0;
  87. if Assigned(AParent) then
  88. begin
  89. vNode := AParent.FirstChild;
  90. iCount := AParent.PosterityCount;
  91. end
  92. else
  93. begin
  94. vNode := AProjectData.BillsCompileData.BillsCompileTree.FirstNode;
  95. iCount := AProjectData.BillsCompileData.BillsCompileTree.Count;
  96. end;
  97. while Assigned(vNode) and (i < iCount) do
  98. begin
  99. if Pos(AName, vNode.Rec.ValueByName('Name').AsString) > 0 then
  100. begin
  101. Result := vNode;
  102. Break;
  103. end
  104. else
  105. vNode := vNode.NextNode;
  106. Inc(i);
  107. end;
  108. end;
  109. var
  110. vQtFyNode, vChild: TsdIDTreeNode;
  111. begin
  112. // 签约合同金额
  113. FQyht := AProjectData.ProjProperties.ContractPrice;
  114. // 复核清单金额
  115. vQtFyNode := FindChild('建安工程其他费用', AProjectData.BillsCompileData.BillsCompileTree.FindNode(1));
  116. with AProjectData.BillsData do
  117. FFhqd := FirstPart[0] + SecondPart[0] + ThirdPart[0] + ReservedFee[0];
  118. if Assigned(vQtFyNode) then
  119. FFhqd := FFhqd - vQtFyNode.Rec.ValueByName('TotalPrice').AsFloat;
  120. // 变更金额
  121. FBg := AProjectData.BGLData.TotalPrice;
  122. // 索赔金额
  123. vChild := FindNode('索赔', vQtFyNode);
  124. if Assigned(vChild) then
  125. FSp := vChild.Rec.ValueByName('TotalPrice').AsFloat
  126. else
  127. FSp := 0;
  128. // 违约罚金
  129. vChild := FindNode('违约罚金', vQtFyNode);
  130. if Assigned(vChild) then
  131. FWy := vChild.Rec.ValueByName('TotalPrice').AsFloat
  132. else
  133. FWy := 0;
  134. // 材料价格调整金额
  135. vChild := FindNode('价差调整', vQtFyNode);
  136. if Assigned(vChild) then
  137. FCljg := vChild.Rec.ValueByName('TotalPrice').AsFloat
  138. else
  139. FCljg := 0;
  140. end;
  141. procedure TrmWuJiuZqzfGatherData.LoadPhaseData(APhaseIndex: Integer;
  142. AProjectData: TProjectData);
  143. function GetDealPayID(const AName: string; AMinus: Boolean = false): Integer;
  144. var
  145. iRec: Integer;
  146. Rec: TsdDataRecord;
  147. begin
  148. Result := -1;
  149. with AProjectData.DealPaymentData do
  150. for iRec := 0 to sddDealPayment.RecordCount - 1 do
  151. begin
  152. Rec := sddDealPayment.Records[iRec];
  153. if (Pos(AName, Rec.ValueByName('Name').AsString) > 0) and (Rec.ValueByName('IsMinus').AsBoolean = AMinus) then
  154. begin
  155. Result := Rec.ValueByName('ID').AsInteger;
  156. Break;
  157. end;
  158. end;
  159. end;
  160. procedure GetDealPayRecords(AList: TList; AName: string; AMinus: Boolean = false; ACalcType: Integer = 0);
  161. var
  162. iRec: Integer;
  163. Rec: TsdDataRecord;
  164. begin
  165. AList.Clear;
  166. with AProjectData.DealPaymentData do
  167. for iRec := 0 to sddDealPayment.RecordCount - 1 do
  168. begin
  169. Rec := sddDealPayment.Records[iRec];
  170. if (Pos(AName, Rec.ValueByName('Name').AsString) > 0) and (Rec.ValueByName('IsMinus').AsBoolean = AMinus)
  171. and (Rec.ValueByName('CalcType').AsInteger = ACalcType) then
  172. begin
  173. AList.Add(Rec);
  174. end;
  175. end;
  176. end;
  177. var
  178. PhaseData: TPhaseData;
  179. sTPField: string;
  180. iDealPayId: Integer;
  181. Rec: TsdDataRecord;
  182. vRecList: TList;
  183. iRec: Integer;
  184. begin
  185. PhaseData := TPhaseData.Create(AProjectData);
  186. vRecList := TList.Create;
  187. try
  188. PhaseData.SimpleOpen(Format('%s\Phase%d.dat', [AProjectData.TempPath, APhaseIndex]));
  189. cdsZqzf.Append;
  190. cdsZqzfPhaseIndex.AsInteger := APhaseIndex;
  191. cdsZqzfQyht.AsFloat := FQyht;
  192. cdsZqzfFhqd.AsFloat := FFhqd;
  193. cdsZqzfBg.AsFloat := AProjectData.BGLData.EndTotalPrice[APhaseIndex];
  194. cdsZqzfSp.AsFloat := FSp;
  195. cdsZqzfWy.AsFloat := FWy;
  196. cdsZqzfCljg.AsFloat := FCljg;//PhaseData.StageData.PriceMargin[2, 4];
  197. cdsZqzfBgh.AsFloat := cdsZqzfFhqd.AsFloat + cdsZqzfBg.AsFloat + cdsZqzfSp.AsFloat + cdsZqzfWy.AsFloat + cdsZqzfCljg.AsFloat;
  198. sTPField := 'TotalPrice' + IntToStr(TPhaseData(PhaseData).PhaseProperty.AuditCount);
  199. with PhaseData.PhasePayData do
  200. begin
  201. iDealPayId := GetDealPayID('本期完成计量');
  202. Rec := sddPhasePay.Locate('ID', iDealPayId);
  203. cdsZqzfEndGather.AsFloat := Rec.ValueByName('End' + sTPField).AsFloat;
  204. cdsZqzfPreGather.AsFloat := Rec.ValueByName('Pre' + sTPField).AsFloat;
  205. cdsZqzfCurGather.AsFloat := Rec.ValueByName(sTPField).AsFloat;
  206. GetDealPayRecords(vRecList, '保留金', true);
  207. for iRec := 0 to vRecList.Count - 1 do
  208. begin
  209. iDealPayId := TsdDataRecord(vRecList.Items[iRec]).ValueByName('ID').AsInteger;
  210. Rec := sddPhasePay.Locate('ID', iDealPayId);
  211. if Assigned(Rec) then
  212. begin
  213. cdsZqzfAddKhBlj.AsFloat := cdsZqzfAddKhBlj.AsFloat + Rec.ValueByName('End' + sTPField).AsFloat;
  214. cdsZqzfCurKhBlj.AsFloat := cdsZqzfCurKhBlj.AsFloat + Rec.ValueByName(sTPField).AsFloat;
  215. end;
  216. end;
  217. GetDealPayRecords(vRecList, '农民工工资', true);
  218. for iRec := 0 to vRecList.Count - 1 do
  219. begin
  220. iDealPayId := TsdDataRecord(vRecList.Items[iRec]).ValueByName('ID').AsInteger;
  221. Rec := sddPhasePay.Locate('ID', iDealPayId);
  222. if Assigned(Rec) then
  223. begin
  224. cdsZqzfAddKhNmggz.AsFloat := cdsZqzfAddKhNmggz.AsFloat + Rec.ValueByName('End' + sTPField).AsFloat;
  225. cdsZqzfCurKhNmggz.AsFloat := cdsZqzfCurKhNmggz.AsFloat + Rec.ValueByName(sTPField).AsFloat;
  226. end;
  227. end;
  228. GetDealPayRecords(vRecList, '动员预付款', false);
  229. for iRec := 0 to vRecList.Count - 1 do
  230. begin
  231. iDealPayId := TsdDataRecord(vRecList.Items[iRec]).ValueByName('ID').AsInteger;
  232. Rec := sddPhasePay.Locate('ID', iDealPayId);
  233. if Assigned(Rec) then
  234. begin
  235. cdsZqzfDyyfk.AsFloat := cdsZqzfDyyfk.AsFloat + Rec.ValueByName(sTPField).AsFloat;
  236. end;
  237. end;
  238. GetDealPayRecords(vRecList, '动员预付款', true);
  239. for iRec := 0 to vRecList.Count - 1 do
  240. begin
  241. iDealPayId := TsdDataRecord(vRecList.Items[iRec]).ValueByName('ID').AsInteger;
  242. Rec := sddPhasePay.Locate('ID', iDealPayId);
  243. if Assigned(Rec) then
  244. begin
  245. cdsZqzfAddKhDyyfk.AsFloat := cdsZqzfAddKhDyyfk.AsFloat + Rec.ValueByName('End' + sTPField).AsFloat;
  246. cdsZqzfCurKhDyyfk.AsFloat := cdsZqzfCurKhDyyfk.AsFloat + Rec.ValueByName(sTPField).AsFloat;
  247. end;
  248. end;
  249. GetDealPayRecords(vRecList, '增值税', true);
  250. for iRec := 0 to vRecList.Count - 1 do
  251. begin
  252. iDealPayId := TsdDataRecord(vRecList.Items[iRec]).ValueByName('ID').AsInteger;
  253. Rec := sddPhasePay.Locate('ID', iDealPayId);
  254. if Assigned(Rec) then
  255. begin
  256. cdsZqzfAddKAddedTax.AsFloat := cdsZqzfAddKAddedTax.AsFloat + Rec.ValueByName('End' + sTPField).AsFloat;
  257. cdsZqzfCurKAddedTax.AsFloat := cdsZqzfCurKAddedTax.AsFloat + Rec.ValueByName(sTPField).AsFloat;
  258. end;
  259. end;
  260. iDealPayId := GetDealPayID('本期应付');
  261. Rec := sddPhasePay.Locate('ID', iDealPayId);
  262. if Assigned(Rec) then
  263. begin
  264. cdsZqzfAddSjzf.AsFloat := Rec.ValueByName('End' + sTPField).AsFloat;
  265. cdsZqzfCurSjzf.AsFloat := Rec.ValueByName(sTPField).AsFloat;
  266. end;
  267. end;
  268. cdsZqzf.Post;
  269. finally
  270. vRecList.Free;
  271. PhaseData.Free;
  272. end;
  273. end;
  274. end.