`
RCFans
  • 浏览: 13118 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

基于规则的业务流程分析

    博客分类:
  • BPM
阅读更多
“思考得少,瞎干得多”,就是目前企业开发的现状。瞎干了两个月后,回头来分析一下一个有趣的流程,是我们目前项目中最复杂的一个流程(因为要完成它而不能动脑,所以复杂)。

首先把UML书上的案例扔到一边,那个是齐全的菜谱、佐料、原料而真实项目是荒地。想想走到荒地上给自己整一顿满汉全席,不容易啊……

现在已经忘了最初听到这个流程的描述是怎么样的了。大概就是“一个待办项会发送和接收很多次,也可以发送接收一次,发送完后就不能再次发送了,最后一个接收结束后才能结束整个流程”——够昏的吧^O^遇到这种事千万不能听客户、需求人员甚至项目经理的,架构师才是设计这个系统的人,不能自己分析、定义业务对象,下课去吧。

第一反应就是发送和接收必须是两个不同的待办项,随后是必须定义两个不同的动作:完全发送和部分发送。概念一定要区分准确。

随后关于如何叫完全发送和部分发送有几次需求上的变化,但不影响流程的执行规则。这个就形成了我在业务流程配置一文中写的ResponseTask类,当时的需求就是请求-接收,所以只写了两个Task;随后扩展成了每接收之后还有一个任务叫填写意见书,所有的意见书完成之后再开始一个新的任务。所以就改成了:请求-接收-响应三个操作,修改ResponseTask,增加了ResponseType这一枚举值属性,修改了结束的算法。目前的流程执行规则是相当死板的,完全硬编码在引擎内部,无法改变。以下是ResponseTask类和执行代码:

using System;
using System.Collections.Generic;
using System.Xml.Serialization; 

namespace Microsoft.Applications.ChinaMobilePMS.FlowEngine
{
    public class ResponseTask : TaskBase, IComparable<ResponseTask>
    {
        private int requestNumber = 0;
        private ResponseType responseMode = ResponseType.Request; 

        [XmlAttribute("RequestNumber")]
        public int RequestNumber
        {
            get { return requestNumber; }
            set { requestNumber = value; }
        } 

        [XmlAttribute("Mode")]
        public ResponseType ResponseMode
        {
            get { return responseMode; }
            set { responseMode = value; }
        } 

        #region IComparable<ResponseTask> Members 

        public int CompareTo(ResponseTask other)
        {
            if (this.responseMode < other.responseMode) { return -1; }
            else if (this.responseMode == other.responseMode) { return 0; }
            else { return 1; }
        } 

        #endregion
    }
} 


using System;
using System.Collections.Generic;
using System.Xml.Serialization; 

namespace Microsoft.Applications.ChinaMobilePMS.FlowEngine
{
    public class Activity : IActivity
    {
        //...
        public void StartActivity(string actionValue)
        {
            switch (mode)
            {
                case TaskMode.Response:
                {
                    responseTasks.Sort();
                    ResponseTask requestTask = responseTasks[0];
                    ResponseTask receiveTask = responseTasks[1];
                    ResponseTask responseTask = responseTasks[2];
                    if (status == StatusType.Scheduled)
                    {
                        status = StatusType.InProgress;
                        requestTask = responseTasks[0];
                        requestTask.CreateTask();
                    }
                    else if (status == StatusType.InProgress)
                    {
                        switch (actionValue)
                        {
                            case "CompleteSubmit":
                                requestTask.Approve += new ApproveHandler(receiveTask.CreateTask);
                                requestTask.ApproveTask();
                                receiveTask.RequestNumber++;
                                break;
                            case "Submit":
                                receiveTask.CreateTask();
                                receiveTask.RequestNumber++;
                                break;
                            case "Receive":
                                receiveTask.Approve += new ApproveHandler(responseTask.CreateTask);
                                receiveTask.ApproveTask();
                                receiveTask.RequestNumber--;
                                responseTask.RequestNumber++;
                                break;
                            case "Reject":
                                receiveTask.Reject += new RejectHandler(requestTask.CreateTask);
                                receiveTask.RejectTask();
                                receiveTask.RequestNumber--;
                                break;
                            case "Response":
                                responseTask.ApproveTask();
                                responseTask.RequestNumber--; 
                                if (((requestTask.Status == StatusType.Completed) && (receiveTask.RequestNumber <= 0) && (responseTask.RequestNumber <= 0)))
                                {
                                    CompleteActivity();
                                }
                                else
                                {
                                    responseTask.Status = StatusType.InProgress;
                                }
                                break;
                            default:
                                break;
                       }
                    }
                }
               break;
            }
        }
    }
} 


昨天参考了Workflow Pattern,其实这个被我表达为Request-Receive-Response的流程的标准描述是以下两个的综合:

Parallel split pattern


Synchronization pattern


于是我拿出纸和笔,画下了这幅图:


想了想,这副图没有把完全发送与部分发送的分支表达出来,于是改成了这幅:


现在呢,有了选择。如果用户选择部分发送,它将走图一的流程,否则就一个简单的2-3-4走完。但是,这时依然缺少了东西,缺少了4开始的条件。并且,部分提交和完全提交唯一的区别就是是否结束1,所以不用专门配分支,再把选择和任务2视为并发任务,因为他们没有先后关系,虽然界面上操作有先有后,但这个选择不能决定任务2是否产生。又改:


这一个算是比较满意的分析模型。根据这个模型,先前硬编码的执行算法将被抽象为ControlRule,它将继承自RuleBase,代表了上图的流程线。而这个分支是用户在执行时选择的,暂定名为Choice:
<ControlRule Mode="Choice">
    <Choice Result="Complete">
        <Then />
    </Choice>
    <Choice Result="Partial">
        <Then />
    </Choice>
</ControlRule> 


规则引擎将解释这个配置并执行。而在Task的执行上,也会定义在配置中,而不是现在这样硬编码。例,选择完全提交之后结束任务一:
<ControlRule Mode="Choice">
    <Choice Result="Complete">
        <Then>
            <Task ID="1" Action="End" Mode="auto" />
        </Then>
    </Choice>
</ControlRule>


这里Mode="auto"意为系统自动处理,不需要产生待办项。接下来是关于任务2的产生,它与Choice并行关系的,而且是任务一提交后必然无条件产生的,故命名为Unconditional:
<ControlRule Mode="Choice" />
<ControlRule Mode="Unconditional">
    <Task ID="2" Action="Start" Mode="manual" />
</ControlRule> 


这里的Mode="manual"表示会生成一条待办项,到达指定办理人处。对于最后任务4启动的验证:
<ControlRule Mode="Conditional">
    <Condition>
        <Task ID="1" Status="Completed" />
        <Task ID="2" Status="Completed" />
        <Task ID="3" Status="Completed" />
    </Condition>
    <Then>
        <Task ID="4" Action="Start" Mode="manual" />
    </Then>
</ControlRule> 


至此,已经基于规则实现了这个流程,其中的三条规则是:选择型、条件型、无条件型;进一步了解之后再进行补充。下一次,将围绕任务进行面向行为的分析,核心问题还是办理人的持久化目的地。
分享到:
评论

相关推荐

    《信息系统分析与设计》业务流程分析.doc

    以下是基于提供的部分内容对业务流程分析的详细解释: 1. 需求分析: 在丹东市房产局信息管理系统中,企业调整损失的需求分析涉及到对现有业务流程的深入理解,以识别改进点和潜在的问题。例如,变动传递单是用来...

    基于SOA的业务流程管理(BPM)和工作流(WF)

    ### 基于SOA的业务流程管理(BPM)和工作流(WF) #### 一、引言 随着信息技术的发展,企业的业务流程管理(BPM)和工作流(WF)已经成为提高组织效率和响应市场变化速度的重要工具。在面向服务的体系结构(SOA)...

    基于SOA的业务流程管理.pptx

    【基于SOA的业务流程管理】是现代企业信息化建设中的重要概念,它旨在通过服务导向架构(Service-Oriented Architecture,简称SOA)来优化和整合业务流程,以提高效率和响应速度。在这个过程中,SOA不仅仅是一种技术...

    基于Spring 的业务规则引擎

    这些调整往往涉及到业务流程的变更。传统的方法是在程序代码中硬编码这些业务规则,但这会导致以下几个主要问题: - **灵活性差**:每次业务规则的更改都需要程序员进行代码级别的修改。 - **维护成本高**:频繁的...

    基于流程-事件,构建灵活业务代码

    1. **业务流程的外化**:将业务流程从核心代码中抽离出来,利用事件来连接不同的服务、规则以及构建业务流程。这样做可以使得流程的变化不会直接影响到核心业务逻辑,从而降低了重构的风险。 2. **服务化**:将稳定...

    基于EA的业务规则建模.pdf

    1. 业务策略:可以建模业务流程中的判定规则。 2. 业务任务:描述业务流程中执行的任务。 3. 业务术语和元素:描述表示与业务规则相关的词汇表、信息元素。 业务规则建模可以帮助我们理解业务规则和策略,提供了...

    基于业务流程的高校数据共享平台设计.doc

    设计基于业务流程的高校数据共享平台,首先需要深入理解各个部门的业务需求,分析信息流和数据流,定义共享规则。业务流程的整合可以帮助识别关键节点,确定数据的来源、处理和目的地,确保数据的准确性和一致性。...

    电信设备-基于规则的多文件信息分析方法.zip

    在IT行业中,对电信设备进行基于规则的多文件信息分析是一项关键任务,它涉及到网络通信、数据处理和系统监控等多个领域。"电信设备-基于规则的多文件信息分析方法.zip"这个压缩包文件包含了深入探讨这一主题的资源...

    基于SaaS模式的流程引擎和规则引擎服务模型研究

    服务化的规则引擎能够将业务规则从业务流程中分离出来,进而提高业务应用的可配置性和灵活性。 在基于SaaS模式的服务模型研究中,流程引擎和规则引擎的技术实现和基础架构主要依托于云计算。云计算为SaaS模式提供...

    基于SOA 的业务规则代理研究

    在这个案例中,移动公司利用基于SOA的业务规则引擎代理来管理其复杂的业务流程。例如,当客户发起服务变更请求时,代理会根据预设的业务规则自动完成一系列操作,如验证用户身份、检查账户余额、调整服务套餐等。这...

    基于Spring的业务规则引擎

    这些规则可能涉及客户的信用评估、订单处理流程等方面,对于确保业务流程的正确执行至关重要。 **2. 规则引擎(Rule Engine)** 规则引擎是一种能够解析并执行业务规则的软件组件。它可以根据预先定义好的规则集,...

    业务流程与自由流程的区别 业务流程可以约束多个单据之间数据转换,而单据转换规则定义的是两个单据之间的转换关系,我们把仅依据单据转

    在业务流程中,每个步骤都有明确的上下游关系,确保了数据从一个单据向另一个单据的准确传递,并且能够根据业务需求设置相应的反写规则,以实现数据的同步更新。此外,业务流程支持上查和下查功能,这意味着可以从...

    基于SOA的业务流程管理(BPM)和工作流(WF)

    ### 基于SOA的业务流程管理(BPM)与工作流(WF) #### 一、引言 随着信息技术的发展,企业管理方式也在不断进化。基于服务导向架构(Service-Oriented Architecture, SOA)的业务流程管理(Business Process ...

    业务建模与业务流程建模概念汇集

    业务流程建模的定义有多种,如Michael Havey认为它是解决特定业务问题的步骤规则;Hammer和Champy提出,业务流程是一系列活动,将一种或多种输入转化为对客户有价值的输出;而Davenport则强调,业务流程是旨在为特定...

Global site tag (gtag.js) - Google Analytics