关于IWorkFlowServce接口
WikeFlow2.0演示地址:http://workflow2.wikesoft.com
该接口是你的业务系统与WikeFlow2.0进行交互的关键接口。
流程执行过程中会自动调用业务类实现的IWorkFlowService接口,实现与你的业务系统的交互。程序集和业务类的设置见《流程定义》
IWorkFlowService
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WikeSoft.WorkFlowEngine.Models;
using WikeSoft.WorkFlowEngine.Msg;
namespace WikeSoft.WorkFlowEngine.Interfaces
{
/// <summary>
/// 发起流程
/// </summary>
public interface IWorkFlowService
{
/// <summary>
/// 流程节点审批前事件
/// </summary>
/// <param name="invokeMember">参数</param>
/// <returns>WorkFlowMessage,如果Code= Fail,会中断流程引擎</returns>
WorkFlowMessage BeforeExecNextEvent(InvokeMember invokeMember);
/// <summary>
/// 流程节点审批后事件
/// </summary>
/// <param name="invokeMember">参数</param>
/// <returns>无论返回结果是否成功,不会中断流程操作</returns>
WorkFlowMessage AfterExecNextEvent(InvokeMember invokeMember);
/// <summary>
/// 删除流程实例前执行事件
/// </summary>
/// <param name="instanceId"></param>
/// <returns>WorkFlowMessage,如果Code= Fail,会中断流程引擎</returns>
WorkFlowMessage BeforeDeleleInstanceEvent(string instanceId);
/// <summary>
/// 删除流程实例后执行事件
/// </summary>
/// <param name="instanceId"></param>
/// <returns>无论返回结果是否成功,不会中断流程操作</returns>
WorkFlowMessage AfterDeleleInstanceEvent(string instanceId);
/// <summary>
/// 流程撤回前事件
/// </summary>
/// <param name="invokeMember">参数</param>
/// <returns>WorkFlowMessage,如果Code= Fail,会中断流程引擎</returns>
WorkFlowMessage BeforeWorkflowWithdraw(InvokeMember invokeMember);
/// <summary>
/// 流程撤回后事件
/// </summary>
/// <param name="invokeMember">参数</param>
/// <returns>无论返回结果是否成功,不会中断流程操作</returns>
WorkFlowMessage AfterWorkflowWithdraw(InvokeMember invokeMember);
}
}
接口参数InvokeMember
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WikeSoft.WorkFlowEngine.Entities;
namespace WikeSoft.WorkFlowEngine.Models
{
/// <summary>
/// 调用参数
/// </summary>
public class InvokeMember
{
/// <summary>
/// 实例ID
/// </summary>
public string InstanceId { get; set; }
/// <summary>
/// 任务ID
/// </summary>
public string TaskId { get; set; }
/// <summary>
/// 任务用户ID
/// </summary>
public string TaskUserId { get; set; }
/// <summary>
/// 用户Id
/// </summary>
public string UserId { get; set; }
/// <summary>
/// 用户名称
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 动作标签
/// </summary>
public string ActionSign { get; set; }
/// <summary>
/// 任务用户
/// </summary>
public WORKFLOW_TASK_USER TaskUser { get; set; }
}
}
ActionSign:是执行动作的属性动作标记设置的值,通过该值,你能知道流程当前执行的什么操作,见下图:
示例1:请假申请在流程审批过程中修改请假表审核状态。
代码解释:
1、当申请人提交,将状态修改为审核中
2、驳回到申请人,将状态修改为未审核
3、流程结束,将状态修改为已审核
/// <summary>
/// 流程节点审批前事件
/// </summary>
/// <param name="invokeMember">参数</param>
/// <returns>WorkFlowMessage,如果Code= Fail,会中断流程引擎</returns>
public WorkFlowMessage BeforeExecNextEvent(InvokeMember invokeMember)
{
WorkFlowMessage workFlowMessage = new InstanceMessage();
try
{
using (var context = new WikeDbContext())
{
var data = context.Holidays.FirstOrDefault(c => c.INSTANCEID == invokeMember.InstanceId);
if (data != null)
{
if (invokeMember.ActionSign == "start")
{
data.AUDITSTATE = "审核中";
}
if (invokeMember.ActionSign == "reject_to_start")
{
data.AUDITSTATE = "未审核";
}
if (invokeMember.ActionSign == "finish")
{
data.AUDITSTATE = "已审核 ";
}
context.Holidays.AddOrUpdate(data);
context.SaveChanges();
}
}
}
catch (Exception ex)
{
workFlowMessage.Code = CodeEum.Fail;
workFlowMessage.Message = ex.Message;
}
return workFlowMessage;
}
示例二:费用报销流程财务审核的时候,要求对每笔费用设置科目,如果费用的科目未设置,则不能提交下一步。
代码解释:
如果流程的费用明细存在未设置科目的数据,则返回异常“请在“报销明细”中设置科目”。
/// <summary>
/// 流程节点审批前事件
/// </summary>
/// <param name="invokeMember">参数</param>
/// <returns>WorkFlowMessage,如果Code= Fail,会中断流程引擎</returns>
public WorkFlowMessage BeforeExecNextEvent(InvokeMember invokeMember)
{
WorkFlowMessage workFlowMessage = new InstanceMessage();
try
{
using (var context = new WikeDbContext())
{
var data = context.Costs.FirstOrDefault(c => c.INSTANCEID == invokeMember.InstanceId);
if (data != null)
{
if (invokeMember.ActionSign == "finace")
{
int cnt = context.CostDetails.Count(x => x.COST_ID == data.ID && x.COST_ACCOUNT == null);
if (cnt > 0)
{
throw new Exception("请在“报销明细”中设置科目");
}
}
context.Costs.AddOrUpdate(data);
context.SaveChanges();
}
}
}
catch (Exception ex)
{
workFlowMessage.Code = CodeEum.Fail;
workFlowMessage.Message = ex.Message;
}
return workFlowMessage;
}
版权所有:本文档的任何部分,包括文字、图片、图形等均归属于成都惟科软件有限公司(以下简称“惟科软件”)。未经书面许可,任何单位或个人不得以任何方式摘录、复制、翻译、修改本手册的全部或部分。除非另有约定,惟科软件不对本手册提供任何明示或默示的声明或保证。
责任声明:在法律允许的最大范围内,本文档是“按照现状”提供,可能存在瑕疵或错误。惟科软件不对本文档提供任何形式的明示或默示保证,包括但不限于适销性、质量满意度、适合特定目的;亦不对使用或是分发本文档导致的任何特殊、附带、偶然或间接的损害进行赔偿,包括但不限于商业利润损失、系统故障、数据或文档丢失产生的损失。