状态机工作流.实列.报销审批流程(一)
这是我在 www.cnblogs.com 发的第一片文章,如果有任何不足之处请各位指正。。。“漫骂”
本片文章面向对像是对,WF稍微有一点了解的朋友
本片文章面向对像是对,WF稍微有一点了解的朋友
业务描述
就是一个简单的报销单流转审批的业务
业务讲解
角色/功能说明
- 报销者
申请、填写、修改、报销单
- 财务
默认1000元以下金额由财务进行审核, 功能:打回(让报销者重新填写)、中止(工作流)、同意(流转到出纳)、加签(遇到特殊情况可以让老板加签就是让老板在审核一下)
- 老板
默认 1000 元以上有老板审核,功能和财务基本一样(没加签)
- 出纳
如果一个报销单,财务或老板审批完成有财务给钱,功能:没钱(等待,自己流转到自己),有钱(流转到取钱确认)除了“报销者” 都可以填写审核意见
工作流设计
明显是一个很标准的状态机的工作流
ExternalDataExchangeService 接口设计 (MyWorkflows.IBILLService.cs,MyWorkflows.IBILLService)
由需求中可知分析出 7 种事件
具体分析代码 IBILLService 工作流设计时使用
- 小金额
由财务和老板的功能分析得出 (财务 默认1000元以下金额由财务进行审核,老板 默认 1000 元以上有老板审核)
- 大金额
同上
- 打回重新修改
财务老板都有 "打回"
- 向下流转
这个不用说了,状态机工作流必然有的向下流转的
- 结束工作流
财务和老板都有 "中止"
- 等待
出纳分析得出(没钱的时候)
- 加签
由财务业务分析得出(遇到特殊情况可以让老板加签)
[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>正常业务不可能没其他数据的虚拟了一个数据实体类保存,报销金额啥的 BillModel (也在 IBILLService)
/// 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
}
[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 我在他的文章中学到了不少东西......