• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
flashelf
博客园    首页    新随笔    联系   管理    订阅  订阅

状态机工作流.实列.报销审批流程(一)

本文以一个报销审批流程为列对WF 进行一下简单的讲解
  这是我在 www.cnblogs.com 发的第一片文章,如果有任何不足之处请各位指正。。。“漫骂”
本片文章面向对像是对,WF稍微有一点了解的朋友

[本文代码下载/download]

 

业务描述

就是一个简单的报销单流转审批的业务

业务讲解

角色/功能
  1. 报销者

      申请、填写、修改、报销单

  2. 财务

      默认1000元以下金额由财务进行审核, 功能:打回(让报销者重新填写)、中止(工作流)、同意(流转到出纳)、加签(遇到特殊情况可以让老板加签就是让老板在审核一下)

  3. 老板

      默认 1000 元以上有老板审核,功能和财务基本一样(没加签)

  4. 出纳

      如果一个报销单,财务或老板审批完成有财务给钱,功能:没钱(等待,自己流转到自己),有钱(流转到取钱确认)

说明
除了“报销者” 都可以填写审核意见

工作流设计

明显是一个很标准的状态机的工作流

ExternalDataExchangeService 接口设计 (MyWorkflows.IBILLService.cs,MyWorkflows.IBILLService)

  由需求中可知分析出 7 种事件


具体分析
  1. 小金额

      由财务和老板的功能分析得出 (财务 默认1000元以下金额由财务进行审核,老板 默认 1000 元以上有老板审核)

  2. 大金额

      同上

  3. 打回重新修改

      财务老板都有 "打回"

  4. 向下流转

      这个不用说了,状态机工作流必然有的向下流转的

  5. 结束工作流

      财务和老板都有 "中止"

  6. 等待

      出纳分析得出(没钱的时候)

  7. 加签

      由财务业务分析得出(遇到特殊情况可以让老板加签)

代码 IBILLService 工作流设计时使用

[ExternalDataExchange]
    
public interface IBILLService
    {
        
/// <summary>
        
/// 小金额
        
/// </summary>
        event EventHandler<ExternalDataEventArgs> BillInitMoneyMin;
        
/// <summary>
        
/// 大金额
        
/// </summary>
        event EventHandler<ExternalDataEventArgs> BillInitMoneyMax;
        
/// <summary>
        
/// 打回重新修改
        
/// </summary>
        event EventHandler<ExternalDataEventArgs> BillUpdated;
        
/// <summary>
        
/// 向下流转
        
/// </summary>
        event EventHandler<ExternalDataEventArgs> BillNext;
        
/// <summary>
        
/// 结束工作流
        
/// </summary>
        event EventHandler<ExternalDataEventArgs> BillCanceled;
        
/// <summary>
        
/// 等待
        
/// </summary>
        event EventHandler<ExternalDataEventArgs> BillWait;
        
/// <summary>
        
/// 加签
        
/// </summary>
        event EventHandler<ExternalDataEventArgs> BillInsert;        
    }


代码 IBILLService 的实现 BillServer
(也在 IBILLService)

 

/// <summary>
    
/// IBILLService 实现,本类在 web项目 <ExternalDataExchangeService/> 节配置加载
    
/// </summary>
    [Serializable]
    
public class BillServer : IBILLService
    {
        
public BillServer()
        {
        
            System.Diagnostics.Debug.WriteLine(
"Create OrderService");
       
        }
        
/// <summary>
        
/// 事件检索字典(不一定非要这么设计,不过个人感觉这么方便触发事件比较简单而且容易被配置化)
        
/// 不过这么做事件子可以被映射一次如果需要映射多次自己改
        
/// </summary>
        Dictionary<string, EventHandler<ExternalDataEventArgs>> _EventList = new Dictionary<string, EventHandler<ExternalDataEventArgs>>();

        
/// <summary>
        
/// 事件触发函数
        
/// </summary>
        
/// <param name="name"></param>
        
/// <param name="instanceId"></param>
        public void RaiseEvent(string name, Guid instanceId)
        {
            
if (_EventList[name] != null)
            {
                EventHandler
<ExternalDataEventArgs> eventHand = _EventList[name];
                ExternalDataEventArgs ede 
= new ExternalDataEventArgs(instanceId);
                
//ede.WorkItem = parms;
                
                eventHand(
this, ede);
            }
        }
        
        
        
#region IBILLService 成员

        
public event EventHandler<ExternalDataEventArgs> BillInitMoneyMin
        {
            add
            {
                _EventList.Add(
"BillInitMoneyMin", value);
            }
            remove
            {
                _EventList.Remove(
"BillInitMoneyMin");
            }
        }

        
public event EventHandler<ExternalDataEventArgs> BillInitMoneyMax
        {
            add
            {
                _EventList.Add(
"BillInitMoneyMax", value);
            }
            remove
            {
                _EventList.Remove(
"BillInitMoneyMax");
            }
        }


        
public event EventHandler<ExternalDataEventArgs> BillUpdated
        {
            add
            {
                _EventList.Add(
"BillUpdated",value);
                
            }
            remove
            {
                _EventList.Remove(
"BillUpdated");
            }
        }


        
public event EventHandler<ExternalDataEventArgs> BillNext
        {
            add
            {
                _EventList.Add(
"BillNext", value);
            }
            remove
            {
                _EventList.Remove(
"BillNext");
            }
        }

        
public event EventHandler<ExternalDataEventArgs> BillCanceled
        {
            add
            {
                _EventList.Add(
"BillCanceled", value);
            }
            remove
            {
                _EventList.Remove(
"BillCanceled");
            }
        }

        
public event EventHandler<ExternalDataEventArgs> BillWait
        {
            add
            {
                _EventList.Add(
"BillWait", value);
            }
            remove
            {
                _EventList.Remove(
"BillWait");
            }        
        }

        
public event EventHandler<ExternalDataEventArgs> BillInsert
        {
            add
            {
                _EventList.Add(
"BillInsert", value);
            }
            remove
            {
                _EventList.Remove(
"BillInsert");
            }        
        }
        
#endregion
    }
正常业务不可能没其他数据的虚拟了一个数据实体类保存,报销金额啥的 BillModel (也在 IBILLService)

 

    [Serializable]
    
public class BillModel
    {
        
string _userName;
        
/// <summary>
        
/// 报销人
        
/// </summary>
        public string UserName
        {
            
get { return _userName; }
            
set { _userName = value; }
        }
        
string _billId;
        
/// <summary>
        
/// 报销编号,数据库里的
        
/// </summary>
        public string BillId
        {
            
get { return _billId; }
            
set { _billId = value; }
        }
        
        
decimal _money;
        
/// <summary>
        
/// 报销金额
        
/// </summary>
        public decimal Money
        {
            
get { return _money; }
            
set { _money = value; }
        }

        
private string fremark;
        
/// <summary>
        
/// 财务批示
        
/// </summary>
        public string Fremark
        {
            
get { return fremark; }
            
set { fremark = value; }
        }
        
private string bremark;
        
/// <summary>
        
/// 老板批示
        
/// </summary>
        public string Bremark
        {
            
get { return bremark; }
            
set { bremark = value; }
        }
        
private string premark;
        
/// <summary>
        
/// 出纳批示
        
/// </summary>
        public string Premark
        {
            
get { return premark; }
            
set { premark = value; }
        }
        
private string lastRemark;
        
/// <summary>
        
/// 最后批示
        
/// </summary>
        public string LastRemark
        {
            
get { return lastRemark; }
            
set { lastRemark = value; }
        }
        
    }


工作流设计 (MyWorkflows.BillWorkflow.cs)

上图中的所有 EventDrivenActivity 里面都子有一个 HandleExternalEventActivity(外部事件) 和一个 SetStateActivity(设置流转)
一下说明工作流和 IBILLService 的对应关系

stateInit/eveTo01 对应 BillInitMoneyMin
stateInit/eveTo01 对应 BillInitMoneyMax
statePayBox/eveWait 对应 BillWait
其他名称(name)是OK 的如 eveomOk,evePok 等对应 BillNext
是 Update 的对应 BillUpdated
是 BillCanceled 对应 BillCanceled
还有一个加签在以后代码中\动态加入,不再设计器中表现

 

下一遍文章将对如何在 web 上实现业务流程,进行讲解 ......

在此感谢 WXWinter 我在他的文章中学到了不少东西......

posted @ 2006-10-06 23:10  曲滨*銘龘鶽  阅读(9514)  评论(26)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3