1

你有没有遇到过这样的情况,如果有,你是怎么解决的?

我们的记录经历了多个发展阶段,例如:

投稿->初评->终审-> 激活

这些主要状态类型的进展顺序是有保证的。然而,有一些因素使事情变得相当复杂:

  • 在记录移动到下一个状态之前,其中一些状态可能需要满足许多附加条件。这些条件或“子状态”中的一些可能是可选的,而一些可能是必需的,或者可能需要满足“3 个可能条件中的任何 2 个”标准。这些子状态或子条件可以以任何顺序得到满足。

  • 该过程可以动态修改,并且对于不同的组是不同的。即系统中存在多个组,每个组的用户可以指定过程中涉及哪些状态和子条件(某些组可以跳过某些状态和子条件)。我们需要以某种方式将流程存储在数据库中以促进这一点。

现在,我知道这是一组相当复杂的标准,所以我不希望有很多反馈。但我想知道是否有一些已发布的设计模式、技术或方法你们都知道来帮助实施这以一种优雅的方式。我和我的同事花了几个小时试图提出最佳解决方案,但我仍然觉得我们目前的解决方案太丑陋了。

如果您想要更多说明,请随时添加评论——这是一个很难描述的问题,所以如果我不够清楚,我不会感到惊讶。谢谢!

4

1 回答 1

1

你可能会考虑

Modelling Office Processes with Functional Parsers
Technical report UU-CS-1994-50
Gert Florijn
Utrecht University
[http://www.serc.nl/people/florijn/papers/UU-CS-1994-50.html][1]

这是一个片段:

3.2. 第一个例子:费用报销

考虑一个报销差旅费的程序。它由必须指定旅行细节的用户发起,特别是所花费的钱。然后将该规范发送给用户的经理,该经理必须批准报销,但也可以拒绝报销。如果获得批准,管理部门将把钱转给员工。稍微简化一下,我们可以对这个过程的顶层进行建模,如下所示:

expenseclaim  = arec "expenseclaim" 
            (serie [expenseform, inspect, oneof [reimbursed, refused]])
reimbursed    = arec "reimbursed"  (serie [approved, reimbursement])

填写费用表意味着提供几条信息,进一步细分为个人信息和索赔本身的信息,例如费用所针对的项目、所涉及的差旅费金额、会议出席费和其他费用:

expenseform = arec "expenseform" (serie [personal, claim])
personal    = arec "personal" (serie [requester,department,bankaccount])
claim       = arec "claim" (serie [project,travel,conference,other])

中的其他解析器被建模为基本动作解析器,即

inspect     = actl "inspect"        approved    = actl "approved"
refused     = actl "refused"        requester   = actl "requester"
department  = actl "department"     bankaccount = actl "bankaccount"
project     = actl "project"        travel      = actl "travel"
conference  = actl "conference"     other       = actl "other"
reimbursement = actl "reimbursement"
于 2010-03-02T08:59:13.550 回答