2017-11-25 233 views
2

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

起初,我想设计一个简单的模块和定义表如下:

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

现在你能想象当用户名顾客= 12做了交易我必须控制,如果交易金额+当前金额>最高金额然后抛出一个异常,否则我必须执行事务并更新当前金额,并且当更新后发生异常时,我必须回滚更新操作(update和rollback在不同的数据库事务中所以回滚是与新金额相同的更新)

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

回答

0

数据可能来自一个数据库表或任何支持服务,这是不是一个真正的问题。
你只需要一些数据来有效的用户事务。

关于框架,您可以使用BPM,但有这么小的需求,这是一个开销。
您可能会采取的一项措施来改进验证规则维护,即将每个特定规则解耦为 。
今天,你有一个验证规则,但在将来,你很可能有多个规则可能使用户事务失效。
驯养它们,你可以简单地定义规则链:

TransactionRule rulesChain;

依赖验证界面:

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

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

建议的方式可能被视为责任链模式的轻描述。
我说“轻”作为规则执行的顺序不应该在你的情况下重要,而它通常在这种模式中很重要。

0

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

+0

嗨,虽然这可能是一个可能的解决方案,但也可以在你的回复中稍微详细一点,并且包括与他们如何实现触发器相关的任何可能的代码。请用所需的工作代码片段编辑您的答案。 –

+0

是啊!我将在下一次做 –