流程节点定制指南
本文档介绍如何在自己的插件中定制新的流程节点,扩展 LMES 流程引擎功能。
详细原理:查看 LMES 流程引擎原理文档
一、创建自定义流程节点
1.1 在自己的插件中创建节点类
在您的插件的 Abstractions 项目中创建自定义节点类,继承自 BusinessActivity 基类。
以下是完整的示例代码(参考 doc/server/src/CMS.Plugin.MyPluginName.Abstractions):
using System.ComponentModel;
using System.Runtime.Serialization;
using CMS.Plugin.FlowManagement.Abstractions.Enums;
using CMS.Plugin.FlowManagement.Abstractions.FlowBusiness.Activitys;
using CMS.Plugin.MesSuite.Abstractions.Models;
using CMS.Plugin.OrderManagement.Abstractions.Models;
using CMS.Plugin.ProcessManagement.Abstractions.Models;
using CMS.Plugin.TraceManagement.Abstractions.Models.Traces;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SYC.Flow.Kernel;
namespace CMS.Plugin.MyPluginName.Abstractions
{
/// <summary>
/// MyPluginName 业务步骤
/// </summary>
[Design("MyPluginName", "MyPluginName 业务步骤", Sort = 99), Category("定制步骤")]
[Serializable]
public class MyPluginNameActivity : BusinessActivity
{
/// <summary>
/// 配置属性1
/// </summary>
[Design("配置属性1", "配置属性1", Sort = 1), Category("配置信息")]
[DataMember]
public string MyProperty1 { get; set; }
/// <summary>
/// 配置属性2
/// </summary>
[Design("配置属性2", "配置属性2", Sort = 2), Category("配置信息")]
[DataMember]
public int MyProperty2 { get; set; }
/// <summary>
/// 流程上下文标识集合
/// </summary>
public override List<FlowItemKey> FlowItemKeys => GetFlowItemKeys();
/// <summary>
/// 工艺流程处理
/// </summary>
public override async Task ProcessAsync(ProcessflowEventArgs args)
{
// 工艺模型
var processModel = Flow.DataItems.ApplicationData as ProcessModel;
// 工单模型
var orderModel = Flow.DataItems[FlowItemCollection.OrderModel] as OrderModel;
// 产品模型
var productModel = Flow.DataItems[FlowItemCollection.ProductModel] as AssociationProductModel;
// 追溯模型
var traceModel = Flow.DataItems[FlowItemCollection.TraceModel] as TraceModel;
Flow.Logger.LogInformation($"执行流程:实例={Flow.Instance.ProcID} -> {Flow.Name} -> {Name}");
// 业务处理
var myPluginNameFlowService = Flow.ServiceProvider.GetService<IMyPluginNameFlowService>();
if (myPluginNameFlowService != null)
{
await myPluginNameFlowService.ProcessAsync(args);
}
}
/// <summary>
/// Gets the flow item keys.
/// </summary>
protected virtual List<FlowItemKey> GetFlowItemKeys()
{
var result = new List<FlowItemKey>();
return result;
}
}
}
关键说明:
| 元素 | 说明 |
|---|---|
[Design] 特性 | 定义节点在流程设计器中的显示名称、描述和排序 |
[Category] 特性 | 定义节点在设计器中的分类 |
[DataMember] 特性 | 标记可在流程设计器中配置的属性 |
[Serializable] 特性 | 节点类必须可序列化 |
ProcessAsync 方法 | 节点的核心业务逻辑,在节点执行时调用 |
FlowItemKeys 属性 | 定义节点使用的流程上下文键 |
1.2 项目引用配置
在您的插件项目文件(.csproj)中添加必要的引用:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<!-- 推荐:包含所有业务插件的 Abstractions 引用,版本号根据项目使用的 LMES 版本确定 -->
<PackageReference Include="CMS.Plugin.MesSuite.Activitys" Version="x.x.x.*" />
</ItemGroup>
</Project>
注意:尽量减少外部依赖,如果必须引用其他程序集,需要在主插件模块中配置共享程序集(见 1.5 节)。
1.3 配置 AssemblyInfo.cs
在 Abstractions 项目的 Properties/AssemblyInfo.cs 中添加流程扩展标记:
using SYC.Flow.Kernel;
[assembly: ProcessflowExtention(true)]
这个特性告诉流程引擎扫描此程序集中的自定义流程节点。
1.4 定义服务接口(可选)
如果业务逻辑较复杂,建议将业务逻辑抽取到服务中:
using SYC.Flow.Kernel;
namespace CMS.Plugin.MyPluginName.Abstractions
{
/// <summary>
/// MyPluginName 流程服务
/// </summary>
public interface IMyPluginNameFlowService
{
/// <summary>
/// 工艺流程处理
/// </summary>
Task ProcessAsync(ProcessflowEventArgs args);
}
}