BillsCommand.pas 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. unit BillsCommand;
  2. interface
  3. uses
  4. BillsMeasureDm, PhaseData, BillsTree,
  5. sdDB, Classes, SysUtils;
  6. type
  7. TBillsCalculate = class
  8. private
  9. FBillsMeasureData: TBillsMeasureData;
  10. FPhaseData: TPhaseData;
  11. procedure ClearNodeCacheData(ANode: TBillsIDTreeNode);
  12. procedure ClearCacheData;
  13. procedure UpdateNodeCacheData(ABillsID: Integer; Rec: TsdDataRecord);
  14. procedure GatherPhaseData(APhaseData: TPhaseData);
  15. procedure GatherAllPhaseData;
  16. procedure WriteNodeGatherData(ANode: TBillsIDTreeNode);
  17. procedure WriteGatherData;
  18. public
  19. constructor Create(ABillsMeasureData: TBillsMeasureData);
  20. destructor Destroy; override;
  21. procedure Execute;
  22. end;
  23. implementation
  24. uses
  25. ProjectData, StageDm;
  26. { TBillsCalculate }
  27. procedure TBillsCalculate.ClearCacheData;
  28. begin
  29. ClearNodeCacheData(TBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.FirstNode));
  30. end;
  31. procedure TBillsCalculate.ClearNodeCacheData(ANode: TBillsIDTreeNode);
  32. begin
  33. if not Assigned(ANode) then Exit;
  34. ANode.DealQuantity := 0;
  35. ANode.DealTotalPrice := 0;
  36. ANode.QcQuantity := 0;
  37. ANode.QcTotalPrice := 0;
  38. ANode.PcQuantity := 0;
  39. ANode.PcTotalPrice := 0;
  40. ANode.GatherQuantity := 0;
  41. ANode.GatherTotalPrice := 0;
  42. ClearNodeCacheData(TBillsIDTreeNode(ANode.FirstChild));
  43. ClearNodeCacheData(TBillsIDTreeNode(ANode.NextSibling));
  44. end;
  45. constructor TBillsCalculate.Create(ABillsMeasureData: TBillsMeasureData);
  46. begin
  47. FBillsMeasureData := ABillsMeasureData;
  48. end;
  49. destructor TBillsCalculate.Destroy;
  50. begin
  51. inherited;
  52. end;
  53. procedure TBillsCalculate.Execute;
  54. begin
  55. ClearCacheData;
  56. GatherAllPhaseData;
  57. WriteGatherData;
  58. end;
  59. procedure TBillsCalculate.GatherAllPhaseData;
  60. var
  61. iIndex: Integer;
  62. begin
  63. with TProjectData(FBillsMeasureData.ProjectData) do
  64. for iIndex :=1 to ProjProperties.PhaseCount do
  65. if iIndex = PhaseIndex then
  66. GatherPhaseData(PhaseData)
  67. else
  68. begin
  69. FPhaseData := TPhaseData.Create(FBillsMeasureData.ProjectData);
  70. try
  71. FPhaseData.Open(Format('%sPhase%d.dat', [TempPath, iIndex]));
  72. GatherPhaseData(FPhaseData);
  73. finally
  74. FPhaseData.Free;
  75. end;
  76. end;
  77. end;
  78. procedure TBillsCalculate.GatherPhaseData(APhaseData: TPhaseData);
  79. var
  80. iIndex: Integer;
  81. Rec: TsdDataRecord;
  82. StageData: TStageData;
  83. bIsNew: Boolean;
  84. begin
  85. bIsNew := not APhaseData.IsLastStage;
  86. if bIsNew then
  87. begin
  88. StageData := TStageData.Create(APhaseData);
  89. StageData.TableName := APhaseData.StageTableName[APhaseData.AuditCount];
  90. StageData.Open(APhaseData.ADOConnection);
  91. end
  92. else
  93. StageData := APhaseData.StageData;
  94. try
  95. if not bIsNew and not APhaseData.PhaseProperty.FinalAudit then
  96. StageData.CalculateAll;
  97. for iIndex := 0 to StageData.sddStage.RecordCount - 1 do
  98. begin
  99. Rec := StageData.sddStage.Records[iIndex];
  100. UpdateNodeCacheData(Rec.ValueByName('BillsID').AsInteger, Rec);
  101. end;
  102. finally
  103. if bIsNew then
  104. StageData.Free;
  105. end;
  106. end;
  107. procedure TBillsCalculate.UpdateNodeCacheData(ABillsID: Integer; Rec: TsdDataRecord);
  108. var
  109. vNode: TBillsIDTreeNode;
  110. begin
  111. vNode := TBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.FindNode(ABillsID));
  112. if not Assigned(vNode) then Exit;
  113. if not vNode.HasChildren then
  114. begin
  115. vNode.DealQuantity := vNode.DealQuantity + Rec.ValueByName('DealQuantity').AsFloat;
  116. vNode.QcQuantity := vNode.QcQuantity + Rec.ValueByName('QcQuantity').AsFloat;
  117. vNode.PcQuantity := vNode.PcQuantity + Rec.ValueByName('PcQuantity').AsFloat;
  118. end;
  119. vNode.GatherQuantity := vNode.GatherQuantity + Rec.ValueByName('DealQuantity').AsFloat
  120. + Rec.ValueByName('QcQuantity').AsFloat;
  121. vNode.DealTotalPrice := vNode.DealTotalPrice + Rec.ValueByName('DealTotalPrice').AsFloat;
  122. vNode.QcTotalPrice := vNode.QcTotalPrice + Rec.ValueByName('QcTotalPrice').AsFloat;
  123. vNode.PcTotalPrice := vNode.PcTotalPrice + Rec.ValueByName('PcTotalPrice').AsFloat;
  124. vNode.GatherTotalPrice := vNode.GatherTotalPrice + Rec.ValueByName('DealTotalPrice').AsFloat
  125. + Rec.ValueByName('QcTotalPrice').AsFloat
  126. + Rec.ValueByName('PcTotalPrice').AsFloat;
  127. //UpdateNodeCacheData(vNode.ParentID, Rec);
  128. end;
  129. procedure TBillsCalculate.WriteGatherData;
  130. begin
  131. WriteNodeGatherData(TBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.FirstNode));
  132. end;
  133. procedure TBillsCalculate.WriteNodeGatherData(ANode: TBillsIDTreeNode);
  134. begin
  135. if not Assigned(ANode) then Exit;
  136. ANode.Rec.ValueByName('AddDealQuantity').AsFloat := ANode.DealQuantity;
  137. ANode.Rec.ValueByName('AddDealTotalPrice').AsFloat := ANode.DealTotalPrice;
  138. ANode.Rec.ValueByName('AddQcQuantity').AsFloat := ANode.QcQuantity;
  139. ANode.Rec.ValueByName('AddQcTotalPrice').AsFloat := ANode.QcTotalPrice;
  140. ANode.Rec.ValueByName('AddPcQuantity').AsFloat := ANode.PcQuantity;
  141. ANode.Rec.ValueByName('AddPcTotalPrice').AsFloat := ANode.PcTotalPrice;
  142. ANode.Rec.ValueByName('AddGatherQuantity').AsFloat := ANode.GatherQuantity;
  143. ANode.Rec.ValueByName('AddGatherTotalPrice').AsFloat := ANode.GatherTotalPrice;
  144. WriteNodeGatherData(TBillsIDTreeNode(ANode.FirstChild));
  145. WriteNodeGatherData(TBillsIDTreeNode(ANode.NextSibling));
  146. end;
  147. end.