2014-12-05 67 views
0

我正在研究可能使用Angular開發SPA應用程序。Angular中的複雜財務計算/業務規則

我們面臨的挑戰是,我們有相當大的量進場,而用戶在表單上輸入數值金融基礎計算的。以下是一個簡化示例:

用戶正在銷售交易輸入表單上輸入明細行。 當他們進入淨額,該系統應計算基於淨值銷售 稅額和總值進入(正如我所說, 它得到比這更復雜)。 這裏需要注意的重要一點是,當用戶跳出Net字段時,他們應該看到Tax和Gross字段更新。

所以,我在這裏看到的兩個高級選項:

  1. 無論這個代碼計算在JavaScript
  2. 撥打服務電話,以 進行計算

無論哪種方式,我想要更新Angular樣式模型的計算結果,這會導致視圖更新。

如果可能的話,我寧願通過服務調用來做到這一點,因爲這樣,它開啓了大門,重新使用在將來其他客戶這一邏輯。我也認爲在C#中編寫這種邏輯應該更快,更易於開發和維護(並將邏輯保存在一個地方)。

理想情況下,我希望在模擬事務的服務中的C#實體中使用此邏輯。

因此,我應該如何去調用這樣的服務器端邏輯?

  1. 我應該以某種方式通過 模型的整個客戶端表示備份到該服務,並將它計算其他值? 不知道我會怎麼做,告訴服務哪些值實際上需要計算。
  2. 或者我應該有(許多)個人 服務方法命名像CalculateTax(淨,taxPercentage) 返回稅額。

還是有一些其他方法或模式,我一直在這裏失蹤?

非常感謝

回答

0

用我全部的愛去的JavaScript,我絕不會相信金融計算的,尤其是在客戶端。

但是。這取決於你需要計算什麼。我的意思是:

1)(您的情況)服務器爲您提供「源」值(如用戶數量等)和百分比(或用戶輸入),並且您不會將此數據傳遞給服務器,那麼您肯定可以,我認爲應該在客戶端做到這一點。2)如果你的價格和項目數量不一樣,你應該在服務器上計算它(你可以在UI上進行預先計算),但是也要從服務器上進行確認。

0

現在根據您提供的業務場景,似乎計算結果是這樣的,您不希望別人知道,它是如何完成的。計算最好保存在服務器端 當您從網絡金額字段中跳出時,您可以致電服務器以獲取銷售稅和您計算的其他值。

你可以這樣經歷。

您有計算銷售稅的方法。現在這需要一個淨額。因此,當您輸入淨額時,您可以撥打個別服務以獲取銷售稅金額和總額。在這裏,您對服務的輸入不是整個客戶端,而僅僅是控制器的淨額。

+0

好指向JavaScript中的calc並保持私有狀態 - 這是進行服務調用並擁有此邏輯服務器端的另一個原因。 – P2l 2014-12-05 11:56:58

1

我會創建一個API端點,接收您需要的計算和值,並返回結果。這將是一樣的,從正常的CRUD API獲得一個記錄使您的角度服務很簡單:

angular.module('fin',[]).service('calculation', function($http) { 
    return { 
     getResult: function(calcMethod, values){ 
      return $http({ 
       url: 'http://backend.com/calculate', 
       method: 'GET', 
       params: { 
        calcMethod: calcMethod, 
        values: values 
       } 
      }); 
     } 
    } 
} 

然後你可以只從你的控制器調用,這樣的事情:

Service.getResult('Sales Tax',[$scope.value1, $scope.value2]).success(function(res) { 
    $scope.result = res; 
}); 
+0

所以你建議一個端點,它需要一個參數來指定計算類型,例如CalcTax,CalcCurrencyTax等。然後執行適用的計算 - 這似乎值得考慮。 – P2l 2014-12-05 11:50:50

+0

我面對的另一個問題是服務中的哪個位置我實際進行計算?例如,我希望它是SalesTransaction實體,以便在淨額的屬性集上進行計算。所以我想在這個服務方法中,我可以創建一個SalesTransaction的新實例,設置網絡和稅率,然後讀取並返回計算出的值。 – P2l 2014-12-05 11:54:34

+0

我不確定我是否理解,但我只是將其作爲控制器的一部分來執行,並且不會將任何計算的值存儲在您的實體中。你只想用服務器端的輸入向服務器提交SalesTransaction,並且你需要在服務器端重新計算其他值,因爲用戶可以在客戶端修改你的js對象。 – 2014-12-05 12:20:57