CSFramework.Workflow | 可视化工作流引擎 | 业务系统集成解决方案|流程引擎
作者:csframework|C/S框架网  发布日期:2023/12/12 11:13:52

CSFramework.Workflow | 可视化工作流引擎 | 业务系统集成解决方案|流程引擎

CSFramework.Workflow - 可视化工作流引擎 - 业务系统集成解决方案

本文将介绍业务系统(如:ERP、MES)集成工作流引擎。

1、业务系统集成架构图

CSFramework.Workflow | 可视化工作流引擎 | 业务系统集成解决方案|流程引擎

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

CSFramework.Workflow | 可视化工作流引擎 | 业务系统集成解决方案|流程引擎

5.1、打开审批界面

C# 全选
BusinessDataProvider.Provider.ApprovalForm.ShowForm(单据号码, 流程图Key, this);

5.2、流程审批界面接口 - IApprovalForm

名称类型描述
DataProviderIFlowDataProvider流程引擎数据提供者
BusinessKeystring业务系统的单据号码主键值
ShowFormvoid打开流程审批窗体
ExecuteCommandvoid执行节点指令
Approvalvoid审核操作
CancelApprovalvoid撤销审批操作
OnApprovalOperationevent工作流审批窗体执行一个操作触发的事件
OnApprovalFinishevent工作流审批完成事件

6、预览原始流程图

C# 全选
frmWorkflowPreview.Execute(单据号码, 流程图Key, false, this);

CSFramework.Workflow | 可视化工作流引擎 | 业务系统集成解决方案|流程引擎

7、预览审批结果流程图

C# 全选
frmWorkflowPreview.Execute("", 流程图Key, false, this);

CSFramework.Workflow | 可视化工作流引擎 | 业务系统集成解决方案|流程引擎

8、业务系统测试程序 (Demo)

CSFramework.Workflow | 可视化工作流引擎 | 业务系统集成解决方案|流程引擎

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();//用户自定义流程审核窗体            

C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇