Browse Source

保存项目时,增加计算自检

MaiXinRong 7 years ago
parent
commit
f853b5a2e4
3 changed files with 91 additions and 6 deletions
  1. 46 4
      DataModules/BillsMeasureDm.pas
  2. 7 1
      Units/CalcDecimal.pas
  3. 38 1
      Units/ProjectData.pas

+ 46 - 4
DataModules/BillsMeasureDm.pas

@@ -4,7 +4,7 @@ interface
 
 
 uses
 uses
   BillsDm, BillsTree, FormulaCalc, sdIDTree, StageDm,
   BillsDm, BillsTree, FormulaCalc, sdIDTree, StageDm,
-  SysUtils, Classes, sdDB, DB;
+  SysUtils, Classes, sdDB, DB, CalcDecimal;
 
 
 type 
 type 
   TLocateZJJLEvent = procedure (ABillsID: Integer) of object;
   TLocateZJJLEvent = procedure (ABillsID: Integer) of object;
@@ -48,6 +48,7 @@ type
 
 
     function GetStageData: TStageData;
     function GetStageData: TStageData;
     procedure SetOnRecChange(const Value: TRecChangeEvent);
     procedure SetOnRecChange(const Value: TRecChangeEvent);
+    function GetDecimal: TCalcDecimal;
   public
   public
     constructor Create(AProjectData: TObject);
     constructor Create(AProjectData: TObject);
     destructor Destroy; override;
     destructor Destroy; override;
@@ -56,6 +57,7 @@ type
     procedure Close;
     procedure Close;
     procedure ReConnectTree;
     procedure ReConnectTree;
 
 
+    function CheckNodeGatherCalc(ANode: TMeasureBillsIDTreeNode): Boolean;
     procedure CalculateAll;
     procedure CalculateAll;
 
 
     procedure ResetPhaseStageLink;
     procedure ResetPhaseStageLink;
@@ -81,6 +83,7 @@ type
     property ProjectData: TObject read FProjectData;
     property ProjectData: TObject read FProjectData;
     property BillsData: TBillsData read FBillsData;
     property BillsData: TBillsData read FBillsData;
     property BillsMeasureTree: TMeasureBillsIDTree read FBillsMeasureTree;
     property BillsMeasureTree: TMeasureBillsIDTree read FBillsMeasureTree;
+    property Decimal: TCalcDecimal read GetDecimal;
 
 
     property StageData: TStageData read GetStageData;
     property StageData: TStageData read GetStageData;
     property ShowParentData: Boolean read FShowParentData write FShowParentData;
     property ShowParentData: Boolean read FShowParentData write FShowParentData;
@@ -91,7 +94,7 @@ implementation
 
 
 uses
 uses
   ProjectData, PhaseData, Math, ZhAPI, BillsCommand, BGLSelectFrm,
   ProjectData, PhaseData, Math, ZhAPI, BillsCommand, BGLSelectFrm,
-  BGLDm, UtilMethods, mDataRecord, ConstUnit, Variants;
+  BGLDm, UtilMethods, mDataRecord, ConstUnit, Variants, ConditionalDefines;
 
 
 {$R *.dfm}
 {$R *.dfm}
 
 
@@ -431,7 +434,7 @@ procedure TBillsMeasureData.sdvBillsMeasureSetText(var Text: String;
 var
 var
   vNode: TBillsIDTreeNode;
   vNode: TBillsIDTreeNode;
 begin
 begin
-  if not Assigned(AValue) then Exit;
+  {if not Assigned(AValue) then Exit;
   // 修改后数据与原数据相同则不提交
   // 修改后数据与原数据相同则不提交
   if not CheckValidData then
   if not CheckValidData then
     Allow := False;
     Allow := False;
@@ -447,7 +450,7 @@ begin
 
 
   Text := Trim(Text);
   Text := Trim(Text);
   if Pos('=', Text) = 1 then
   if Pos('=', Text) = 1 then
-    Text := Copy(Text, 2, Length(Text) - 1);
+    Text := Copy(Text, 2, Length(Text) - 1);  }
 
 
   DoCurChanged(vNode);
   DoCurChanged(vNode);
 end;
 end;
@@ -1172,4 +1175,43 @@ begin
   end;
   end;
 end;
 end;
 
 
+function TBillsMeasureData.CheckNodeGatherCalc(
+  ANode: TMeasureBillsIDTreeNode): Boolean;
+var
+  fLeafSumDeal, fLeafSumQc, fLeafSumGather: Double;
+  i, iCount: Integer;
+  vChild: TMeasureBillsIDTreeNode;
+begin
+  if Assigned(ANode.StageRec) then
+  begin
+    fLeafSumDeal := 0;
+    fLeafSumQc := 0;
+    fLeafSumGather := 0;
+    iCount := ANode.PosterityCount;
+    i := 0;
+    vChild := TMeasureBillsIDTreeNode(ANode.NextNode);
+    while i < iCount do
+    begin
+      if not vChild.HasChildren and Assigned(vChild.StageRec) then
+      begin
+        fLeafSumDeal := fLeafSumDeal + vChild.StageRec.DealTotalPrice.AsFloat;
+        fLeafSumQc := fLeafSumQc + vChild.StageRec.QcTotalPrice.AsFloat;
+        fLeafSumGather := fLeafSumGather + vChild.StageRec.GatherTotalPrice.AsFloat;
+      end;
+      vChild := TMeasureBillsIDTreeNode(vChild.NextNode);
+      Inc(i);
+    end;
+    Result := Decimal.TotalPrice.CheckSameNum(fLeafSumDeal, ANode.StageRec.DealTotalPrice.AsFloat) and
+              Decimal.TotalPrice.CheckSameNum(fLeafSumQc, ANode.StageRec.QcTotalPrice.AsFloat) and
+              Decimal.TotalPrice.CheckSameNum(fLeafSumGather, ANode.StageRec.GatherTotalPrice.AsFloat);
+  end
+  else
+    Result := True;
+end;
+
+function TBillsMeasureData.GetDecimal: TCalcDecimal;
+begin
+  Result := TProjectData(FProjectData).ProjProperties.DecimalManager.Common;
+end;
+
 end.
 end.

+ 7 - 1
Units/CalcDecimal.pas

@@ -23,6 +23,7 @@ type
 
 
     function RoundTo(AValue: Double): Double;
     function RoundTo(AValue: Double): Double;
     function StrRoundTo(const AValue: string): string;
     function StrRoundTo(const AValue: string): string;
+    function CheckSameNum(AValue1, AValue2: Double): Boolean;
 
 
     procedure ClearLinkViewCols;
     procedure ClearLinkViewCols;
     procedure AddLinkViewCol(ACol: TObject);
     procedure AddLinkViewCol(ACol: TObject);
@@ -78,7 +79,7 @@ type
 implementation
 implementation
 
 
 uses
 uses
-  ProjectData, UtilMethods, SysUtils;
+  ProjectData, UtilMethods, SysUtils, Math;
 
 
 { TDecimal }
 { TDecimal }
 
 
@@ -87,6 +88,11 @@ begin
   FLinkViewCols.Add(ACol);
   FLinkViewCols.Add(ACol);
 end;
 end;
 
 
+function TDecimal.CheckSameNum(AValue1, AValue2: Double): Boolean;
+begin
+  Result := Abs(RoundTo(AValue1 - AValue2)) < CompareValue;
+end;
+
 procedure TDecimal.ClearLinkViewCols;
 procedure TDecimal.ClearLinkViewCols;
 begin
 begin
   FLinkViewCols.Clear;
   FLinkViewCols.Clear;

+ 38 - 1
Units/ProjectData.pas

@@ -88,6 +88,7 @@ type
     procedure CloseAllData;
     procedure CloseAllData;
     procedure OpenAllData;
     procedure OpenAllData;
 
 
+    procedure CheckCalcBeforeSave;
     procedure InnerSave;
     procedure InnerSave;
 
 
     procedure LoadCheckersData;
     procedure LoadCheckersData;
@@ -268,7 +269,8 @@ implementation
 uses UtilMethods, Globals, ProjectCommands, sdIDTree, StageDm,
 uses UtilMethods, Globals, ProjectCommands, sdIDTree, StageDm,
   ZJJLDm, PHPWebDm, XMLDoc, XMLIntf, ConstUnit, PasswordInputFrm,
   ZJJLDm, PHPWebDm, XMLDoc, XMLIntf, ConstUnit, PasswordInputFrm,
   mProgressProFrm, mDataRecord, ConditionalDefines, DbTreeImport,
   mProgressProFrm, mDataRecord, ConditionalDefines, DbTreeImport,
-  StrUtils, sdProvider, CalcDecimal, Math, CslJson, OrderCheckerFme;
+  StrUtils, sdProvider, CalcDecimal, Math, CslJson, OrderCheckerFme,
+  Forms, ProgressHintFrm, BillsTree, Controls;
 
 
 { TProjectData }
 { TProjectData }
 
 
@@ -2124,6 +2126,8 @@ begin
   try
   try
     AppendProjectLog('Save Main Data');
     AppendProjectLog('Save Main Data');
 
 
+    CheckCalcBeforeSave;
+
     UpdateSysProgress(5, '正在保存数据');
     UpdateSysProgress(5, '正在保存数据');
     SaveLastestPhaseMainData;
     SaveLastestPhaseMainData;
     UpdateSysProgress(10, '正在保存数据');
     UpdateSysProgress(10, '正在保存数据');
@@ -2210,4 +2214,37 @@ begin
   end
   end
 end;
 end;
 
 
+procedure TProjectData.CheckCalcBeforeSave;
+
+  function NeedReCalc: Boolean;
+  var
+    vTopNode: TsdIDTreeNode;
+  begin
+    Result := False;
+    vTopNode := BillsMeasureData.BillsMeasureTree.FirstNode;
+    while not Result and Assigned(vTopNode) do
+    begin
+      if not BillsMeasureData.CheckNodeGatherCalc(TMeasureBillsIDTreeNode(vTopNode)) then
+        Result := True;
+      vTopNode := vTopNode.NextSibling;
+    end;
+  end;
+
+var
+  i: Integer;
+  fLeafSum, fTopParent: Double;
+begin
+  if PhaseData.Active and (not StageDataReadOnly) and NeedReCalc then
+  begin
+    Screen.Cursor := crHourGlass;
+    try
+      ShowProgressHint('检查到有需要计算的清单,请稍候...');
+      CalculateAll;
+      CloseProgressHint;
+    finally
+      Screen.Cursor := crDefault;
+    end;
+  end;
+end;
+
 end.
 end.