如何计算、控制和更新客户信用?

How to calculate, control customer credit and update it?

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

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

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

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

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

我想你可以使用数据库触发器来实现这个requirement.It现在会帮助你实现你想要的

数据可能来自数据库table或来自任何支持服务,这不是真正的问题。
您只需要一些数据即可使用户交易有效。

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

TransactionRule rulesChain;

依赖于验证接口:

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

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

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