C# 角度复杂的财务计算/业务规则

C# 角度复杂的财务计算/业务规则,c#,angularjs,web-services,soa,business-logic,C#,Angularjs,Web Services,Soa,Business Logic,我正在考虑用Angular开发一个SPA应用程序 我们面临的挑战之一是,当用户在表单上输入值时,我们有大量基于财务的计算。下面是一个简化的示例: 用户正在销售交易记录输入表单上输入明细行。 当他们输入净金额时,系统应计算销售额 基于输入净值的税额和总值(如我所说, 它确实变得比这更复杂)。 这里需要注意的重要一点是,当用户从“净”字段中签出时,他们应该会看到“税”和“毛”字段的更新。 因此,我在这里看到两个高级选项: 要么用JavaScript编写此计算 打服务电话给 执行计算 无论哪种方式,我

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

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

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

因此,我在这里看到两个高级选项:

  • 要么用JavaScript编写此计算
  • 打服务电话给 执行计算
  • 无论哪种方式,我都希望使用计算结果更新角度样式模型,这将导致视图更新

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

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

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

  • 我是否应该以某种方式传递 将模型备份到服务,并让它计算其他值? 不知道我会如何告诉服务部门 值实际上需要计算
  • 或者我应该有(很多)个人 命名为CalculateTax(net,taxPercentage)之类的服务方法 返回税额
  • 或者是我在这里完全缺少的其他方法或模式


    非常感谢

    尽管我非常喜欢javascript,但我永远不会相信它的财务计算,尤其是在客户端

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

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


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

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

    你可以这样经历


    你有计算销售税的方法。现在这需要一个净额。因此,当您输入净金额并在字段外添加选项卡时,您可以调用个人服务获取销售税金额和总金额。在这里,您对服务的输入不是整个客户端,而是绑定到控制器的净额。

    我将创建一个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;
    });
    

    因此,您建议使用一个端点,该端点包含一个指定计算类型的参数,即CalcTax、CalcCurrencyTax等。?然后执行适用的计算-这看起来确实值得考虑。我面临的另一个问题是我在服务中实际在哪里进行计算?例如,我希望它是SalesTransaction实体,以便在净值的属性集上进行计算。因此,我假设在这个服务方法中,我可以创建SalesTransaction的一个新实例,设置净税率和税率,然后读取并返回计算值。我不确定我是否理解,但我只是作为控制器的一部分来做,不会将任何计算值存储在您的实体中。您只需要将SalesTransaction和用户输入提交回服务器,并且您需要在服务器端重新计算其他值,因为用户可以在客户端修改您的js对象。对于客户端,用户在某些情况下可以更改计算的税额,所以它需要是模型上的一个属性。我的最后一点是关于如何编写代码服务端来进行计算。例如,我是否在服务方法中有代码来执行此操作。或者我尝试将该逻辑放在服务器端实体/模型中(即使在进行此计算时,我不会将其保存到数据库中)。要么服务很愚蠢,只从服务器获取一个值,因此不需要计算它。或者服务器用一个公式(有点奇怪,因为您必须在DB上存储javascript公式,尽管它可能工作得很好),然后服务应用该公式,在JavaScript中使用calc并保持其私有性,这是进行服务调用并在服务器端使用此逻辑的另一个原因。