【问题标题】:Complex financial calculations/business rules in AngularAngular 中的复杂财务计算/业务规则
【发布时间】:2014-12-05 10:42:09
【问题描述】:

我正在考虑使用 Angular 开发一个 SPA 应用程序。

我们面临的一个挑战是,当用户在表单上输入值时,我们需要进行大量基于财务的计算。这是一个简化的示例:

用户正在销售交易输入表单上输入明细行。 当他们输入净额时,系统应计算销售额 基于输入的净值的税额和总价值(正如我所说, 它确实比这更复杂)。 这里要注意的重要一点是,当用户从 Net 字段中跳出时,他们应该会看到 Tax 和 Gross 字段更新。

所以我在这里看到两个高级选项:

  1. 在 JavaScript 中编写此计算代码
  2. 拨打服务电话到 执行计算

无论哪种方式,我都希望使用计算结果更新 Angular 样式模型,这将导致视图更新。

在可能的情况下,我更愿意通过服务调用来执行此操作,因为这样它为将来从其他客户端重用此逻辑打开了大门。我还认为用 C# 编写这种逻辑应该更快地开发和更易于维护(并将逻辑保持在一个地方)。

理想情况下,我希望在为事务建模的服务中的 C# 实体中使用此逻辑。

因此,我应该如何调用这样的服务器端逻辑?

  1. 我是否应该以某种方式传递整个客户端表示 模型备份到服务并让它计算其他值? 不知道在告诉服务哪个方面我会如何做到这一点 值实际上需要计算。
  2. 或者我应该有(很多)个人 服务方法命名为 CalculateTax(net, taxPercentage) 返回税额。

或者我在这里完全缺少其他一些方法或模式?

非常感谢

【问题讨论】:

    标签: c# angularjs web-services soa business-logic


    【解决方案1】:

    我将创建一个 API 端点来接收您需要的计算和值,并返回结果。这与从普通 CRUD API 获取单个记录相同,从而使您的 Angular 服务变得非常简单:

    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;
    });
    

    【讨论】:

    • 所以你是在建议一个单一的端点,它接受一个指定计算类型的参数,即 CalcTax、CalcCurrencyTax 等?然后执行适用的计算——这当然值得考虑。
    • 我面临的另一个问题是我实际上在服务中的哪个位置进行了计算?例如,我希望它是 SalesTransaction 实体,以便在净额的属性集上进行计算。所以我想在这个服务方法中,我可以创建一个新的 SalesTransaction 实例,设置净值和税率,然后读取并返回计算值。
    • 我不确定我是否理解,但我只是将其作为控制器的一部分,并且不会将任何计算值存储在您的实体中。您只想将带有用户输入的 SalesTransaction 提交回您的服务器,并且您需要在服务器端再次重新计算其他值,因为用户可以在客户端修改您的 js 对象。
    • 对于客户端而言,用户在某些情况下可以更改计算的Tax金额,因此它需要是模型上的一个属性。我的最后一点更多的是关于我如何编写代码服务端来进行计算。例如,我是否只是在服务方法中有代码来执行此操作。或者我是否尝试将该逻辑放在服务器端实体/模型中(即使在进行此计算时我不会将其保存到数据库中)。
    • 据我所知,有两种方法。要么服务很愚蠢,只是从服务器获取一个值,因此它不需要计算它。或者服务器回复一个公式(有点奇怪,因为你必须在数据库上存储一个 javascript 公式,尽管它可能工作得很好)然后服务将该公式应用于你拥有的任何参数。
    【解决方案2】:

    由于我对 javascript 的热爱,我永远不会相信财务计算,尤其是在客户端。

    但是。这取决于你到底需要计算什么。我的意思是:

    1)(您的情况)服务器为您提供“来源”值(如用户的金额等)和百分比(或用户输入),并且您不将此数据传递给服务器,那么您肯定可以,而且我认为应该,在客户端执行此操作。

    2) 如果你有类似商品的价格和数量,你应该在服务器上计算(你可以在 UI 上进行预计算),但也要从服务器确认。

    【讨论】:

      【解决方案3】:

      现在根据您提供的业务场景,您似乎不想让其他人知道它的计算方式,它是如何完成的。计算最好保存在服务器端 每当您跳出净额字段时,您都可以调用服务器来获取销售税和您计算的其他值。

      你可以这样过。

      您有计算销售税的方法。现在这需要一个净额。因此,当您输入净金额并从该字段中跳出时,您可以调用个人服务来获取销售税金额和总金额。在这里,您对服务的输入不是整个客户端,而只是绑定到控制器的净数量。

      【讨论】:

      • 关于 JavaScript 中的计算并保持私有的好点 - 进行服务调用并拥有此逻辑服务器端的另一个原因。
      猜你喜欢
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多