rmCustomized2Dm.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. unit rmCustomized2Dm;
  2. // 广东肇庆定制 -- 汇总表(计量汇总表)
  3. // 严禁任何其他项目使用该单元
  4. interface
  5. uses
  6. SysUtils, Classes, ZhAPI, DB, ProjectData, DBClient,
  7. rmSelectProjectFrm, sdDB;
  8. type
  9. TTenderBaseData = class
  10. private
  11. FTenderName: string;
  12. FTotalPrice: Double;
  13. FEndCTotalPrice: Double;
  14. FCurDealTotalPrice: Double;
  15. FPreDealTotalPrice: Double;
  16. FEndDealTotalPrice: Double;
  17. function GetEndGatherTotalPrice: Double;
  18. function GetPrecent: Double;
  19. public
  20. constructor Create(const ATenderName: string);
  21. property TenderName: string read FTenderName;
  22. property TotalPrice: Double read FTotalPrice write FTotalPrice;
  23. property EndCTotalPrice: Double read FEndCTotalPrice write FEndCTotalPrice;
  24. property EndGatherTotalPrice: Double read GetEndGatherTotalPrice;
  25. property CurDealTotalPrice: Double read FCurDealTotalPrice write FCurDealTotalPrice;
  26. property PreDealTotalPrice: Double read FPreDealTotalPrice write FPreDealTotalPrice;
  27. property EndDealTotalPrice: Double read FEndDealTotalPrice write FEndDealTotalPrice;
  28. property Precent: Double read GetPrecent;
  29. end;
  30. TDealPayData = class
  31. private
  32. FName: string;
  33. FCurTotalPrice: Double;
  34. FPreTotalPrice: Double;
  35. FEndTotalPrice: Double;
  36. public
  37. constructor Create(const AName: string);
  38. property Name: string read FName;
  39. property CurTotalPrice: Double read FCurTotalPrice write FCurTotalPrice;
  40. property PreTotalPrice: Double read FPreTotalPrice write FPreTotalPrice;
  41. property EndTotalPrice: Double read FEndTotalPrice write FEndTotalPrice;
  42. end;
  43. TGatherData = class
  44. private
  45. FTenders: TList;
  46. FTenderGather: TTenderBaseData;
  47. FDealPays: TList;
  48. FPayGather: TDealPayData;
  49. function FindDealPay(const AName: string): TDealPayData;
  50. function GetTenderCount: Integer;
  51. function GetTenders(AIndex: Integer): TTenderBaseData;
  52. function GetDealPay(AIndex: Integer): TDealPayData;
  53. function GetDealPayCount: Integer;
  54. public
  55. constructor Create;
  56. destructor Destroy; override;
  57. function AddTender(const ATenderName: string): TTenderBaseData;
  58. procedure GatherTender;
  59. function AddDealPay(const AName: string): TDealPayData;
  60. property TenderCount: Integer read GetTenderCount;
  61. property Tenders[AIndex: Integer]: TTenderBaseData read GetTenders;
  62. property TenderGather: TTenderBaseData read FTenderGather;
  63. property DealPayCount: Integer read GetDealPayCount;
  64. property DealPay[AIndex: Integer]: TDealPayData read GetDealPay;
  65. property PayGather: TDealPayData read FPayGather;
  66. end;
  67. TrmCustomized2Data = class(TDataModule)
  68. cdsCustom: TClientDataSet;
  69. cdsCustomSerialNo: TIntegerField;
  70. cdsCustomName: TWideStringField;
  71. cdsCustomTotalPrice: TFloatField;
  72. cdsCustomEndCTotalPrice: TFloatField;
  73. cdsCustomEndGatherTotalPrice: TFloatField;
  74. cdsCustomCurDealTotalPrice: TFloatField;
  75. cdsCustomPreDealTotalPrice: TFloatField;
  76. cdsCustomEndDealTotalPrice: TFloatField;
  77. cdsCustomPrecent: TFloatField;
  78. private
  79. FProjectData: TProjectData;
  80. FProjectName: string;
  81. FGatherData: TGatherData;
  82. FSerialNo: Integer;
  83. procedure BeforeGather;
  84. procedure AfterGather;
  85. procedure OpenProjectData(AProject: TSelectProject);
  86. procedure FreeProjectData;
  87. procedure GatherProject(AProject: TSelectProject);
  88. procedure WriteData;
  89. public
  90. function AssignData(AProjects: TList): TDataSet;
  91. end;
  92. implementation
  93. uses
  94. DealPaymentDm, PhasePayDm, Globals, UtilMethods;
  95. {$R *.dfm}
  96. { TTenderBaseData }
  97. constructor TTenderBaseData.Create(const ATenderName: string);
  98. begin
  99. FTenderName := ATenderName;
  100. FTotalPrice := 0;
  101. FEndCTotalPrice := 0;
  102. FCurDealTotalPrice := 0;
  103. FPreDealTotalPrice := 0;
  104. FEndDealTotalPrice := 0;
  105. end;
  106. function TTenderBaseData.GetEndGatherTotalPrice: Double;
  107. begin
  108. Result := TotalPrice + EndCTotalPrice;
  109. end;
  110. function TTenderBaseData.GetPrecent: Double;
  111. begin
  112. if EndGatherTotalPrice <> 0 then
  113. Result := EndDealTotalPrice/EndGatherTotalPrice*100
  114. else
  115. Result := 0;
  116. end;
  117. { TGatherData }
  118. function TGatherData.AddDealPay(const AName: string): TDealPayData;
  119. begin
  120. Result := FindDealPay(AName);
  121. if not Assigned(Result) then
  122. begin
  123. Result := TDealPayData.Create(AName);
  124. FDealPays.Add(Result);
  125. end;
  126. end;
  127. function TGatherData.AddTender(const ATenderName: string): TTenderBaseData;
  128. begin
  129. Result := TTenderBaseData.Create(ATenderName);
  130. FTenders.Add(Result);
  131. end;
  132. constructor TGatherData.Create;
  133. begin
  134. FTenders := TList.Create;
  135. FTenderGather := TTenderBaseData.Create('合计');
  136. FDealPays := TList.Create;
  137. FPayGather := TDealPayData.Create('支付');
  138. end;
  139. destructor TGatherData.Destroy;
  140. begin
  141. FPayGather.Free;
  142. ClearObjects(FDealPays);
  143. FDealPays.Free;
  144. FTenderGather.Free;
  145. ClearObjects(FTenders);
  146. FTenders.Free;
  147. inherited;
  148. end;
  149. function TGatherData.FindDealPay(const AName: string): TDealPayData;
  150. var
  151. iIndex: Integer;
  152. begin
  153. Result := nil;
  154. for iIndex := 0 to DealPayCount - 1 do
  155. begin
  156. if SameText(AName, DealPay[iIndex].Name) then
  157. begin
  158. Result := DealPay[iIndex];
  159. Break;
  160. end;
  161. end;
  162. end;
  163. procedure TGatherData.GatherTender;
  164. var
  165. iIndex: Integer;
  166. Tender: TTenderBaseData;
  167. begin
  168. FTenderGather.TotalPrice := 0;
  169. FTenderGather.EndCTotalPrice := 0;
  170. FTenderGather.CurDealTotalPrice := 0;
  171. FTenderGather.PreDealTotalPrice := 0;
  172. FTenderGather.EndDealTotalPrice := 0;
  173. for iIndex := 0 to FTenders.Count - 1 do
  174. begin
  175. Tender := Tenders[iIndex];
  176. FTenderGather.TotalPrice := FTenderGather.TotalPrice + Tender.TotalPrice;
  177. FTenderGather.EndCTotalPrice := FTenderGather.EndCTotalPrice + Tender.FEndCTotalPrice;
  178. FTenderGather.CurDealTotalPrice := FTenderGather.CurDealTotalPrice + Tender.CurDealTotalPrice;
  179. FTenderGather.PreDealTotalPrice := FTenderGather.PreDealTotalPrice + Tender.PreDealTotalPrice;
  180. FTenderGather.EndDealTotalPrice := FTenderGather.EndDealTotalPrice + Tender.EndDealTotalPrice;
  181. end;
  182. end;
  183. function TGatherData.GetDealPay(AIndex: Integer): TDealPayData;
  184. begin
  185. Result := TDealPayData(FDealPays.Items[AIndex]);
  186. end;
  187. function TGatherData.GetDealPayCount: Integer;
  188. begin
  189. Result := FDealPays.Count;
  190. end;
  191. function TGatherData.GetTenderCount: Integer;
  192. begin
  193. Result := FTenders.Count;
  194. end;
  195. function TGatherData.GetTenders(AIndex: Integer): TTenderBaseData;
  196. begin
  197. Result := TTenderBaseData(FTenders.Items[AIndex]);
  198. end;
  199. { TDealPayData }
  200. constructor TDealPayData.Create(const AName: string);
  201. begin
  202. FName := AName;
  203. FCurTotalPrice := 0;
  204. FPreTotalPrice := 0;
  205. FEndTotalPrice := 0;
  206. end;
  207. { TrmCustomized2Data }
  208. procedure TrmCustomized2Data.AfterGather;
  209. begin
  210. FGatherData.Free;
  211. end;
  212. function TrmCustomized2Data.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(TSelectProject(AProjects.Items[iProject]));
  220. FGatherData.GatherTender;
  221. WriteData;
  222. finally
  223. Result := cdsCustom;
  224. AfterGather;
  225. end;
  226. end;
  227. procedure TrmCustomized2Data.BeforeGather;
  228. begin
  229. cdsCustom.Active := True;
  230. cdsCustom.EmptyDataSet;
  231. FGatherData := TGatherData.Create;
  232. end;
  233. procedure TrmCustomized2Data.FreeProjectData;
  234. begin
  235. if not Assigned(OpenProjectManager.FindProjectData(FProjectData.ProjectID)) then
  236. FProjectData.Free;
  237. end;
  238. procedure TrmCustomized2Data.GatherProject(AProject: TSelectProject);
  239. var
  240. sCurField, sPreField, sEndField: string;
  241. function DealPayRecord(const AName: string): TsdDataRecord;
  242. var
  243. iRec: Integer;
  244. Rec: TsdDataRecord;
  245. begin
  246. Result := nil;
  247. with FProjectData.DealPaymentData do
  248. begin
  249. for iRec := 0 to sddDealPayment.RecordCount - 1 do
  250. begin
  251. Rec := sddDealPayment.Records[iRec];
  252. if SameText(AName, Rec.ValueByName('Name').AsString) then
  253. begin
  254. Result := Rec;
  255. Break;
  256. end;
  257. end;
  258. end;
  259. end;
  260. procedure GatherBaseData;
  261. var
  262. TenderBase: TTenderBaseData;
  263. Rec, StageRec: TsdDataRecord;
  264. begin
  265. TenderBase := FGatherData.AddTender(FProjectName);
  266. TenderBase.TotalPrice := FProjectData.BillsData.Settlement[0];
  267. TenderBase.EndCTotalPrice := FProjectData.BillsData.Settlement[2];
  268. Rec := DealPayRecord('本期完成计量');
  269. StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);
  270. TenderBase.CurDealTotalPrice := StageRec.ValueByName(sCurField).AsFloat;
  271. TenderBase.PreDealTotalPrice := StageRec.ValueByName(sPreField).AsFloat;
  272. TenderBase.EndDealTotalPrice := StageRec.ValueByName(sEndField).AsFloat;
  273. end;
  274. procedure GatherCommonDealPayData;
  275. var
  276. iRec: Integer;
  277. Rec, StageRec: TsdDataRecord;
  278. DealPay: TDealPayData;
  279. begin
  280. with FProjectData.DealPaymentData do
  281. begin
  282. for iRec := 0 to sddDealPayment.RecordCount - 1 do
  283. begin
  284. Rec := sddDealPayment.Records[iRec];
  285. if SameText(Rec.ValueByName('Name').AsString, '本期完成计量') or
  286. SameText(Rec.ValueByName('Name').AsString, '本期应付') or
  287. SameText(Rec.ValueByName('Name').AsString, '本期实付') then
  288. Continue;
  289. StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);
  290. if StageRec.ValueByName(sEndField).AsFloat = 0 then
  291. Continue;
  292. DealPay := FGatherData.AddDealPay(Rec.ValueByName('Name').AsString);
  293. DealPay.CurTotalPrice := DealPay.CurTotalPrice + StageRec.ValueByName(sCurField).AsFloat;
  294. DealPay.PreTotalPrice := DealPay.PreTotalPrice + StageRec.ValueByName(sPreField).AsFloat;
  295. DealPay.EndTotalPrice := DealPay.EndTotalPrice + StageRec.ValueByName(sEndField).AsFloat;
  296. end;
  297. end;
  298. end;
  299. procedure GatherPayData;
  300. var
  301. Rec, StageRec: TsdDataRecord;
  302. begin
  303. Rec := DealPayRecord('本期应付');
  304. StageRec := FProjectData.PhaseData.PhasePayData.PayRecord(Rec.ValueByName('ID').AsInteger);
  305. with FGatherData.PayGather do
  306. begin
  307. CurTotalPrice := CurTotalPrice + StageRec.ValueByName(sCurField).AsFloat;
  308. PreTotalPrice := PreTotalPrice + StageRec.ValueByName(sPreField).AsFloat;
  309. EndTotalPrice := EndTotalPrice + StageRec.ValueByName(sEndField).AsFloat;
  310. end;
  311. end;
  312. begin
  313. OpenProjectData(AProject);
  314. try
  315. sCurField := 'TotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);
  316. sPreField := 'PreTotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);
  317. sEndField := 'EndTotalPrice' + IntToStr(FProjectData.PhaseData.AuditCount);
  318. GatherBaseData;
  319. GatherCommonDealPayData;
  320. GatherPayData;
  321. finally
  322. FreeProjectData;
  323. end;
  324. end;
  325. procedure TrmCustomized2Data.OpenProjectData(AProject: TSelectProject);
  326. var
  327. Rec: TsdDataRecord;
  328. begin
  329. FProjectData := OpenProjectManager.FindProjectData(AProject.ProjectID);
  330. Rec := ProjectManager.sddProjectsInfo.FindKey('idxID', AProject.ProjectID);
  331. if not Assigned(FProjectData) then
  332. begin
  333. FProjectData := TProjectData.Create;
  334. FProjectData.OpenForReport2(GetMyProjectsFilePath + Rec.ValueByName('FileName').AsString);
  335. end;
  336. FProjectName := Rec.ValueByName('Name').AsString;
  337. end;
  338. procedure TrmCustomized2Data.WriteData;
  339. procedure WriteProjectData;
  340. var
  341. i: Integer;
  342. Tender: TTenderBaseData;
  343. begin
  344. for i := 0 to FGatherData.TenderCount - 1 do
  345. begin
  346. Tender := FGatherData.Tenders[i];
  347. cdsCustom.Append;
  348. cdsCustomSerialNo.AsInteger := FSerialNo;
  349. cdsCustomName.AsString := Tender.TenderName;
  350. cdsCustomTotalPrice.AsFloat := Tender.TotalPrice;
  351. cdsCustomEndCTotalPrice.AsFloat := Tender.EndCTotalPrice;
  352. cdsCustomEndGatherTotalPrice.AsFloat := Tender.EndGatherTotalPrice;
  353. cdsCustomCurDealTotalPrice.AsFloat := Tender.CurDealTotalPrice;
  354. cdsCustomPreDealTotalPrice.AsFloat := Tender.PreDealTotalPrice;
  355. cdsCustomEndDealTotalPrice.AsFloat := Tender.EndDealTotalPrice;
  356. cdsCustomPrecent.AsFloat := Tender.Precent;
  357. cdsCustom.Post;
  358. Inc(FSerialNo);
  359. end;
  360. end;
  361. procedure WriteProjectGather;
  362. begin
  363. cdsCustom.Append;
  364. cdsCustomName.AsString := FGatherData.TenderGather.TenderName;
  365. cdsCustomTotalPrice.AsFloat := FGatherData.TenderGather.TotalPrice;
  366. cdsCustomEndCTotalPrice.AsFloat := FGatherData.TenderGather.EndCTotalPrice;
  367. cdsCustomEndGatherTotalPrice.AsFloat := FGatherData.TenderGather.EndGatherTotalPrice;
  368. cdsCustomCurDealTotalPrice.AsFloat := FGatherData.TenderGather.CurDealTotalPrice;
  369. cdsCustomPreDealTotalPrice.AsFloat := FGatherData.TenderGather.PreDealTotalPrice;
  370. cdsCustomEndDealTotalPrice.AsFloat := FGatherData.TenderGather.EndDealTotalPrice;
  371. cdsCustomPrecent.AsFloat := FGatherData.TenderGather.Precent;
  372. cdsCustom.Post;
  373. end;
  374. procedure WriteDealPays;
  375. var
  376. i: Integer;
  377. DealPay: TDealPayData;
  378. begin
  379. for i := 0 to FGatherData.DealPayCount - 1 do
  380. begin
  381. DealPay := FGatherData.DealPay[i];
  382. cdsCustom.Append;
  383. cdsCustomSerialNo.AsInteger := FSerialNo;
  384. cdsCustomName.AsString := DealPay.Name;
  385. cdsCustomCurDealTotalPrice.AsFloat := DealPay.CurTotalPrice;
  386. cdsCustomPreDealTotalPrice.AsFloat := DealPay.PreTotalPrice;
  387. cdsCustomEndDealTotalPrice.AsFloat := DealPay.EndTotalPrice;
  388. cdsCustom.Post;
  389. Inc(FSerialNo);
  390. end;
  391. end;
  392. procedure WriteGatherPay;
  393. begin
  394. cdsCustom.Append;
  395. cdsCustomSerialNo.AsInteger := FSerialNo;
  396. cdsCustomName.AsString := FGatherData.PayGather.Name;
  397. cdsCustomCurDealTotalPrice.AsFloat := FGatherData.PayGather.CurTotalPrice;
  398. cdsCustomPreDealTotalPrice.AsFloat := FGatherData.PayGather.PreTotalPrice;
  399. cdsCustomEndDealTotalPrice.AsFloat := FGatherData.PayGather.EndTotalPrice;
  400. cdsCustom.Post;
  401. end;
  402. begin
  403. FSerialNo := 1;
  404. WriteProjectData;
  405. WriteProjectGather;
  406. WriteDealPays;
  407. WriteGatherPay;
  408. end;
  409. end.