CSFramework.Workflow - 可视化工作流引擎 - 业务系统集成解决方案
CSFramework.Workflow - 可视化工作流引擎 - 业务系统集成解决方案
本文将介绍业务系统(如:ERP、MES)集成工作流引擎。
目录
1、业务系统集成架构图
2、业务系统集成工作流引擎
业务系统是指企业级管理应用系统,如ERP,MES,CRM,OA等系统。
本文指业务系统如果使用CSFramework.Workflow 工作流引擎。
集成工作流主要工作:
- 业务系统需要实例化流程引擎的数据提供者(BusinessDataProvider.Provider = 实例化)
- 业务系统可以定制流程审批界面(设计一个Form,实现 IApprovalForm接口)
- 业务系统可以定制数据表单界面(通过执行节点指令,调用用户定制的表单界面)
- 业务系统可实现工作流引擎的相关事件(Events),从而得到实时数据以及双向数据交互。
3、数据提供者接口 - IFlowDataProvider
主要介绍以下两部分:
3.1、权限系统数据
名称 | 类型 | 对象类型 | 描述 |
LoginUser | 属性 | class LoginUser | 当前业务系统登录的用户 |
Users | 属性 | List<OperationUser> | 业务系统的用户列表 |
Roles | 属性 | List<OperationRole> | 业务系统的角色列表 |
Groups | 属性 | List<OperationGroup> | 业务系统的组织架构(部门) |
GroupUserRelations | 属性 | List<OperationGroupAndUserRelation> | 组织架构与用户关系表 |
UserRoleRelations | 属性 | List<OperationUserRolesRelation> | 用户的角色关系表 |
3.2、流程审批界面使用的主要方法
名称 | 类型 | 返回对象类型 | 描述 |
ExecuteCommand | 方法 | ExecuteCommandResult | 执行节点指令 |
GetInstanceData | 方法 | IDictionary<string, string> | 获取流程节点实例数据(表单数据) |
IsWorkflowReferenced | 方法 | bool | 流程图是否在业务系统使用 |
3.3、流程审批界面使用的属性
名称 | 类型 | 返回对象类型 | 描述 |
LoginUser | 属性 | LoginUser | 当前业务系统登录的用户 |
DbOption | 属性 | DatabaseOptions | 数据库参数,用于构建Connection实例 |
ConditionParams | 属性 | List<ConditionParam> | 业务系统提供的审批条件参数 |
BusinessDocTypes | 属性 | List<OperationDocType> | 业务单据类型列表,如:SO-销售订单, AP-应付款 |
ApprovalForm | 属性 | IApprovalForm | 用户自定义流程审批窗体接口(系统默认提供 frmApprovalFlow 审批窗体) |
4、打开工作流设计器
C# 全选
new frmWorkflowDesigner().ShowDialog(this);
或
C# 全选
IFlowDataProvider provider = new BusinessProvider_Demo_FeeApply();
new frmWorkflowDesigner(provider).ShowDialog(this);
5、工作流审批界面
CSFramework.Workflow 工作流引擎默认提供的流程审批界面。
界面名称:frmApprovalFlow
5.1、打开审批界面
C# 全选
BusinessDataProvider.Provider.ApprovalForm.ShowForm(单据号码, 流程图Key, this);
5.2、流程审批界面接口 - IApprovalForm
名称 | 类型 | 描述 |
DataProvider | IFlowDataProvider | 流程引擎数据提供者 |
BusinessKey | string | 业务系统的单据号码或主键值 |
ShowForm | void | 打开流程审批窗体 |
ExecuteCommand | void | 执行节点指令 |
Approval | void | 审核操作 |
CancelApproval | void | 撤销审批操作 |
OnApprovalOperation | event | 工作流审批窗体执行一个操作触发的事件 |
OnApprovalFinish | event | 工作流审批完成事件 |
6、预览原始流程图
C# 全选
frmWorkflowPreview.Execute(单据号码, 流程图Key, false, this);
7、预览审批结果流程图
C# 全选
frmWorkflowPreview.Execute("", 流程图Key, false, this);
8、业务系统测试程序 (Demo)
CSFramework.Workflow - 工作流程引擎测试程序
https://www.cscode.net/archive/csframework.workflow/487841008947205.html
9、《费用申请单》业务系统数据提供者
业务系统集成审批流程须要实现一个数据提供者。参考下面代码:
BusinessProvider_Demo_FeeApply.cs
C# 全选
using CSFramework.Workflow.Common;
using CSFramework.Workflow.Common.Enums;
using CSFramework.Workflow.Common.Events;
using CSFramework.Workflow.Common.Models;
using CSFramework.Workflow.Engine;
using CSFramework.Workflow.Engine.DataProvider;
using System;
using System.Collections.Generic;
using System.Data.Entity.Migrations;
using System.Linq;
namespace CSFramework.Workflow.Demo
{
/// <summary>
/// 《费用申请单》业务系统数据提供者
/// </summary>
public class BusinessProvider_Demo_FeeApply : BusinessDataProviderBase
{
public BusinessProvider_Demo_FeeApply() : base()
{
BusinessClientDataProvider.InitConnection(this);//设置数据库连接
BusinessClientDataProvider.InitPermission(this);//设置权限数据
this.ApprovalForm = new frmApprovalFlow();//用户自定义流程审核窗体
this.ApprovalForm.OnApprovalFinish += ApprovalForm_OnApprovalFinish;
this.ApprovalForm.OnApprovalOperation += ApprovalForm_OnApprovalOperation;
}
/// <summary>
/// 节点审批事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ApprovalForm_OnApprovalOperation(object sender, OnApprovalOperationEventArgs e)
{
if (e.Success && (e.ActionName == ApprovalAction.Approval || e.ActionName == ApprovalAction.CancelApproval))
{
if (e.Data is WorkflowApprovalData data)
{
this.UpdateBusinessDocApproval(data, false);
}
}
}
/// <summary>
/// 审批完成事件
/// </summary>
/// <param name="data"></param>
private void ApprovalForm_OnApprovalFinish(WorkflowApprovalData data)
{
this.UpdateBusinessDocApproval(data, true);
}
/// <summary>
/// 业务系统是否使用了流程图
/// </summary>
/// <param name="flowKey">流程图Id</param>
/// <returns></returns>
public override bool IsWorkflowReferenced(string flowKey)
{
return BusinessClientDataProvider.IsWorkflowReferenced(flowKey);
}
/// <summary>
/// 获取实例数据(表单数据)
/// </summary>
/// <param name="businessKey">业务系统单据号码或主键值</param>
/// <param name="flowKey">流程图Id</param>
/// <param name="nodeKey">流程节点Id</param>
/// <returns></returns>
public override InstanceData GetInstanceData(string businessKey, string flowKey, string nodeKey = null)
{
InstanceData result = new InstanceData();
//当前【费用申请单】的数据
Dictionary<String, String> dict = new Dictionary<string, string>();
dict["员工编码"] = "E2093981";
dict["员工姓名"] = "张三";
dict["期间"] = "2023/11";
dict["差旅费"] = "3500";
dict["电话费"] = "1300";
dict["其他补贴"] = "1000";
dict["总费用"] = "5800";
//当前【费用申请单】的附件
var files = new List<WorkflowNodeFiles>
{
new WorkflowNodeFiles { DataKey="001", FileName="费用申请.pdf", FileData=new byte[]{ }, FileType=".pdf"},
};
result.KeyValues = dict;
result.AttachedFiles = files;
return result;
}
/// <summary>
/// 审批条件参数
/// </summary>
public override List<ConditionParam> ConditionParams
{
get
{
return new List<ConditionParam>
{
new ConditionParam("FY","差旅费","差旅费",typeof(Decimal)),
new ConditionParam("FY","电话费","电话费",typeof(Decimal)),
new ConditionParam("FY","其他补贴","其他补贴",typeof(Decimal)),
new ConditionParam("FY","总费用","TotalAmount",typeof(Decimal)),
};
}
}
/// <summary>
/// 执行节点指令
/// </summary>
/// <param name="businessKey">业务系统单据号码或主键值</param>
/// <param name="flowNode">流程节点数据</param>
/// <returns></returns>
public override ExecuteCommandResult ExecuteCommand(string businessKey, WorkflowNodeData flowNode)
{
var result = new ExecuteCommandResult();
try
{
//
//编写代码:在这里执行节点指令
//
//demo1: 更新数据
if (flowNode.FunctionImplement.ToLower() == "cmd01")
{
//
//调用更新数据接口
//
result.ResultType = "调用更新数据接口";
}
result.CommandId = flowNode.FunctionImplement;
result.TaskId = IdHelper.GetTimeId();
result.Success = true;
result.ResultMessage = $"执行指令成功,cmdId={flowNode.FunctionImplement}";
return result;
}
catch (Exception ex)
{
result.Success = false;
result.ResultMessage = ex.Message;
return result;
}
}
/// <summary>
/// 更新当前单据的审批状态
/// </summary>
/// <param name="data"></param>
/// <param name="isFinish"></param>
/// <returns></returns>
internal bool UpdateBusinessDocApproval(WorkflowApprovalData data, bool isFinish)
{
using (var db = DemoDataDbContext.Create())
{
var obj = db.Demo_FeeApplyModel.Where(w => w.FANO == data.BusinessKey).FirstOrDefault();
if (obj != null)
{
obj.FlagApp = isFinish ? "Y" : "N";
obj.AppUser = this.LoginUser.UserId;
obj.AppUserName = this.LoginUser.UserName;
obj.AppTime = DateTime.Now;
obj.AppComment = data.ApprovalComments;
obj.AppStatus = data.ApprovalStatus;
obj.AppWorkflowKey = data.FlowDataKey;//工作流key
db.Demo_FeeApplyModel.AddOrUpdate(obj);
return db.SaveChanges() == 1;
}
else
{
return false;
}
}
}
/// <summary>
/// 获取《费用申请单》单据列表
/// </summary>
/// <returns></returns>
internal List<Demo_FeeApplyModel> GetDemoData()
{
using (var context = new DemoDataDbContext(BusinessClientDataProvider.ConnectionString))
{
return context.Demo_FeeApplyModel.ToList();
}
}
}
}
初始化流程引擎的数据提供者
C# 全选
BusinessDataProvider.Provider = new BusinessProvider_Demo_FeeApply();
初始化流程引擎的审批界面
C# 全选
this.ApprovalForm = new frmApprovalFlow();//用户自定义流程审核窗体
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
csframework.workflow C/S框架网