2008-12-11 29 views
2

所以我有一个对象图,我们只是说它是一个订单。您有订单类,订单项类,跟踪编号类,付款类。你明白了。如何在需要批准以实际进行更改时保存对象?

现在业务需求是任何用户都可以更改订单,但订单更改必须经过经理批准。直到经理批准没有任何变化。管理人员可以随时改变任何事情,无需批准。

处理这种情况的最佳做法是什么?保存订单对象的许多(可能的)不同状态,并最终批准或拒绝更改。

我使用C#和Nhibernate。

谢谢,凯尔。

回答

2

我会创建一个事务表。它将为每个待处理的更改记录。它会引用订单表。

因此,订单将被创建,但有待处理的更改;将在订单表中插入一条记录,其状态列为挂起,并且记录将被插入到OrderTransaction表中。

对于每次更改,其他记录都会插入到OrderTransaction表中。

我还将设置一个RequestedChanges表,其中包含所有可能的请求更改。

1

我对nHibernate没有任何经验。

对于这样的情况下,最好是留给数据库来存储订单(状态= ForManagerToApproveOrReject),然后就可以查询,看看哪些订单正在等待批准/拒绝(从经理的观点)

一经理可以批准/拒绝它。 保存订单的继承模式(ApprovedOrder,RejectedOrder)似乎有点奇怪。

0

我明白那个部分,我遇到的问题是弄清楚订单未获批准时如何/保存所有更改。例如,用户A添加了付款,用户B更改了地址,用户C添加了新的订单项。

直到经理批准订单保持原来的状态(或从数据库中检索)。一旦管理员进入审批屏幕,他/她可以批准/拒绝每个变更。将更改写入原始订单并保留审核。用户A在ay上通过zzz批准的yyy更改了xxx。

2

与Sam WIlliamson关于事务表的想法类似,我将使用临时表。

由非经理人员进行的更改转到临时表中的新订单对象。经理将有一个界面来审核这些等待批准的订单,并且系统将已经保存所有更改,但不在标准位置。

这也可能是用户界面的问题,他们必须同时看到订单的正式版本和挂起版本版本,以便了解对象的状态。

无论如何,我认为你最好的选择是将对象存储为正常的,但在正式记录的单独表格中,等待经理审查。这张临时表不应该变得很大,因为它代表了经理必须接受的批准积压。

1

一个简单的解决方法就是让另一个订单,它是原始的拷贝应用了变化,状态设置为PendingApproval,并自动递增VERSIONNUMBER。更改表的主键以包含ApprovalDate。然后,当前批准的订单始终是具有最近批准日期的订单。

0

你所描述的是一个工作流程,它对我来说听起来像是一个很好的候选人Windows Workflow Foundation。如果您的工作流程对业务至关重要,我倾向于将其从数据库逻辑中分离出来,WWF将允许您执行此操作。

1

如果订单没有完成,直到批准你可能希望有一个挂单,并已完成的订单表结构。挂单可能只是序列化的对象,只有在批准后才写出订单,订单行等。

如果允许更改订单审批后,变得更加复杂,你可能还需要考虑到后期审批步骤,收到付款,采摘,包装,运输等

有很多方法可以做到这一点类型的事情,你如何做这将取决于真正的业务需求是什么。即您说经理可以随时更改订单,但是如果他们真的被允许更改已发货的订单吗?

0

感谢您的所有答案。实际的业务用例不是创建订单,但如果我试图解释实际的业务,我不得不写几个段落。底线是管理人员需要在深层嵌套的对象图上缓和变化,然后才能“上线”。

我喜欢交易表的想法。

我也想保存的两个版本“命令,”一个有变化,一个没有。

我想我必须深入了解两者,看看会发生什么。

+0

从它看起来像你必须允许在一次由多人多变化的说明,所有的争夺经理批准 – 2008-12-11 22:34:58

相关问题