业务描述
就是一个简单的报销单流转审批的业务
业务讲解
角色/功能说明
- 报销者
申请、填写、修改、报销单- 财务
默认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
还有一个加签在以后代码中/动态加入,不再设计器中表现