【问题标题】:How to calculate, control customer credit and update it?如何计算、控制和更新客户信用?
【发布时间】:2018-05-09 05:13:19
【问题描述】:

我有一个财务系统,我必须设计一个用于保存、更新和控制限制的模块。 您可以知道每个客户都有一个 UserID,并且每个 UserID 每天都有一个最大信用额度。例如,UserID = 12 的 MaxAmountPerDay = 10$CurrentAmountPerDay

一开始我想设计一个简单的模块,定义一个表格如下:

  User ID | MaxAmountPerDay | CurrentAmountPerDay
-------------------------------------------------
  12     | 10              | 0
  25     | 100             | 84

现在您可以想象,当 UserID = 12 的客户完成交易时,我必须控制 交易金额 + 当前金额 > 最大金额 然后抛出异常否则我必须执行事务并更新当前金额,当更新后发生异常时,我必须回滚更新操作。(更新和回滚在不同的数据库事务中,因此回滚是与新金额相同的更新)

在我做这个设计之前,我决定寻找一个更好的解决方案,甚至是一个开源框架来做这件事,因为我猜我的客户的需求将来会发生变化,例如他们可能需要MaxAmountPerMonth,或者我现在不知道的更多要求。

【问题讨论】:

    标签: java design-patterns frameworks open-source


    【解决方案1】:

    数据可能来自数据库表或任何支持服务,这不是问题。
    您只需要一些数据来验证用户交易。

    关于框架,您可以使用 BPM,但要求如此之小,这是一种开销。
    您可以做的事情来改进验证规则维护是 将每个特定规则解耦。
    今天,您有一个验证规则,但在未来,您很可能会有多个可能使用户交易无效的规则。
    要处理它们,您可以简单地定义一个规则链:

    TransactionRule rulesChain;

    依赖于验证接口:

    public interface TransactionRule{
      void valid(UserInformation userInformation) throw ValidationException;
    }
    

    链的每个元素都是这个接口的一个实现。
    当您在规则链上调用 valid() 时,它会应用第一条规则。
    如果规则受到用户信息的尊重,它会将手传递给下一个规则。
    等等... 并且一旦一个元素抛出ValidationException,就意味着不遵守规则,因此验证结束,事务必须取消。

    建议的方式可以看作是责任链模式的轻量级版本。
    我说“轻”是因为规则执行的顺序在您的情况下并不重要,而在这种模式中通常很重要。

    【讨论】:

      【解决方案2】:

      我认为你可以使用数据库触发器来实现这个要求。它将帮助你实现你现在想要的

      【讨论】:

      • 嗨,虽然这可能是一个可能的解决方案,但最好在您的回复中更详细一点,并包含与他们如何实现触发器相关的任何可能的代码。请使用所需的工作代码 sn-p 编辑您的答案。
      • 是的!下次我会做的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多