流程管理场景示例
重新激活流程
H3.Workflow.Messages.ActivateInstanceMessage activiteinstanceMessage
= new H3.Workflow.Messages.ActivateInstanceMessage(this.Request.InstanceId); //传递参数为流程实例 ID
this.Request.Engine.WorkflowInstanceManager.SendMessage(activiteinstanceMessage); //只会激活流程,不会触发当前运行的节点
取消流程
取消当前流程实例会将流程实例状态改为已取消,所有进行中的节点会变为已取消状态。
H3.Workflow.Messages.CancelInstanceMessage cancelMessage
= new H3.Workflow.Messages.CancelInstanceMessage(this.Request.InstanceId,false);
this.Request.Engine.WorkflowInstanceManager.SendMessage(cancelMessage);
结束流程
直接结束当前流程实例,当前进行中的节点会变为已取消状态。
//获取当前流程实例对象
H3.Workflow.Instance.WorkflowInstance instance
= this.Request.Engine.WorkflowInstanceManager.GetWorkflowInstance(this.Request.InstanceId);
H3.Workflow.Messages.FinishInstanceMessage finishMessage
= new H3.Workflow.Messages.FinishInstanceMessage(this.Request.InstanceId,
(int)instance.FinalTokenId);
this.Request.Engine.WorkflowInstanceManager.SendMessage(finishMessage);
结束流程会执行自定义代码中定义的 OnWorkflowInstanceStateChanged 方法。
⚠️ 注意
如果流程设置的是发起节点直接到结束节点,或者审批节点全部符合自动通过逻辑,流程状态是从草稿变为生效的。见如下代码示例:// protected override void OnWorkflowInstanceStateChanged(H3.Workflow.Instance.WorkflowInstanceState oldState, H3.Workflow.Instance.WorkflowInstanceState newState) { //流程审批结束事件(先执行业务规则,在执行该方法)。 if ((oldState == H3.Workflow.Instance.WorkflowInstanceState.Running || oldState == H3.Workflow.Instance.WorkflowInstanceState.Initiated) && newState == H3.Workflow.Instance.WorkflowInstanceState.Finished) { //执行业务代码逻辑 } //流程审批结束后,重新激活事件(先执行业务规则,在执行该方法)。 if (oldState == H3.Workflow.Instance.WorkflowInstanceState.Finished && newState == H3.Workflow.Instance.WorkflowInstanceState.Running) { //执行业务代码逻辑 } base.OnWorkflowInstanceStateChanged(oldState, newState); }
激活某个活动节点
//参数对应描述:流程实例 ID,活动节点编码,令牌 ID,参与者,前驱令牌,是否检测入口条件,激活类型
H3.Workflow.Messages.ActivateActivityMessage activiteMessage =
new H3.Workflow.Messages.ActivateActivityMessage(this.Request.InstanceId,
"Activity3",
H3.Workflow.Instance.Token.UnspecifiedId,
new string[] {},
null,
false,
H3.Workflow.WorkItem.ActionEventType.Adjust);
//激活节点注意事项如下:
//- 不会取消正在运行的节点
//- 进行中的流程才能激活调整
this.Request.Engine.WorkflowInstanceManager.SendMessage(activiteMessage);
取消某个活动节点
H3.Workflow.Messages.CancelActivityMessage cancelMessage
= new H3.Workflow.Messages.CancelActivityMessage(this.Request.InstanceId,
"Activity3",
false);
//取消正在进行中的节点
this.Request.Engine.WorkflowInstanceManager.SendMessage(cancelMessage);
如何创建带流程表单同时发起流程
发起流程接口定义:WorkflowInstanceManager.OriginateInstance。
H3.DataModel.BizObjectSchema schema = this.Request.Engine.BizObjectManager.GetPublishedSchema("D000001InspectIssue");
H3.DataModel.BizObject bizData = new H3.DataModel.BizObject(this.Request.Engine,
schema,
this.Request.UserContext.UserId,
this.Request.UserContext.User.ParentId);
bizData["IssueReportName"] = "关于****的整改报告";
string instanceId = System.Guid.NewGuid().ToString();
if (string.IsNullOrEmpty(bizData.WorkflowInstanceId))
{
bizData.WorkflowInstanceId = instanceId;
}
//创建业务数据
bizData.Create();
H3.Workflow.Instance.WorkflowInstance wfInstance
= this.Request.Engine.WorkflowInstanceManager.GetWorkflowInstance(bizData.WorkflowInstanceId);
//如果数据还没有绑定流程实例,则启动流程
if (wfInstance == null)
{
//启动流程
string workItemID = string.Empty;
string errorMsg = string.Empty;
//读取流程模板
H3.Workflow.Template.WorkflowTemplate wfTemp = this.Request.Engine.WorkflowTemplateManager.GetDefaultWorkflow(bizData.Schema.SchemaCode);
this.Request.Engine.WorkflowInstanceManager.OriginateInstance(
this.Request.UserContext.UserId,
bizData.Schema.SchemaCode,
wfTemp.WorkflowVersion,
bizData.ObjectId,
bizData.WorkflowInstanceId,
H3.Workflow.WorkItem.AccessMethod.Web,
true,
string.Empty,
true,
out workItemID,
out errorMsg);
} //第七个参数 `false` 或 `true` 表示是否提交流程操作
根据流程 ID 获取流程当前所处节点
IToken 定义:H3.Workflow.Instance.IToken。
/*
token 对象属性如下:
- token.Activity:流程节点编码(string 类型)
- token.Approval:审批状态(H3.Data.BoolValue 类型)
- H3.Data.BoolValue.True 表示同意
- H3.Data.BoolValue.False 表示不同意
- H3.Data.BoolValue.Unspecified 表示未处理或节点被取消
- token.TokenId:流程步骤表(H_Token)ObjectId 字段值(string 类型)
- token.Participants:流程审批人(string[] 类型,每个元素为审批人用户 ID)
- token.CreatedTime:流程节点创建时间(DateTime 类型)
- token.FinishedTime:流程节点结束时间(DateTime 类型)
- token.UsedTime:节点从开始到结束耗时(TimeSpan 类型)
*/
H3.Workflow.Instance.IToken token
= this.Request.Engine.WorkflowInstanceManager.GetWorkflowInstance("流程 ID").GetLastToken();
根据流程实例 ID 查询指定状态工作项的显示名称和参与者
//InstanceIds: 流程实例 ID 数组
//H3.Workflow.WorkItem.WorkItemState 状态说明:
//- Waiting 处于等待的状态
//- Working 处于正在工作中的状态
//- Finished 处于完成状态
//- Canceled 已经被取消
//- Unfinished 不属于 WorkItem 本身状态(指 Waiting 或 Working 状态)
//- NotCanceled 不属于 WorkItem 本身状态(指 Waiting、Working 或 Finished 状态)
//- Unspecified 未指定的状态
System.Data.DataTable b = this.Engine.Query.QueryWorkItemDisplayAndParticipant(
string[] InstanceIds,
H3.Workflow.WorkItem.WorkItemState state);
表单后端获取审批时填入的审批意见
protected override void OnSubmit(string actionName,
H3.SmartForm.SmartFormPostValue postValue,
H3.SmartForm.SubmitSmartFormResponse response)
{
//`Activity3`节点审批同意时获取审批意见
if (actionName == "Submit" && this.Request.ActivityCode == "Activity3")
{
string comment = postValue.Comment.Text;
}
//`Activity3`节点审批不同意时获取审批意见
if (actionName == "Reject" && this.Request.ActivityCode == "Activity3")
{
string comment = postValue.Comment.Text;
}
base.OnSubmit(actionName, postValue, response);
}
结束当前待办并流程继续向下流转
H3.Workflow.WorkItem.WorkItem item = this.Request.WorkItem;
H3.Data.BoolValue approval = H3.Data.BoolValue.True;
// 结束工作项
ErrorCode finishWorkItemResult = this.Engine.WorkItemManager.FinishWorkItem(
this.Request.UserContext.UserId,
item.WorkItemId,
H3.Workflow.WorkItem.AccessMethod.Web,
approval,
"审批意见",
"Submit",
H3.Workflow.WorkItem.ActionEventType.Forward,
false);
// 通知实例事件管理器结束事件,继续向下流转
H3.Workflow.Messages.AsyncEndMessage endMessage = new H3.Workflow.Messages.AsyncEndMessage(
item.InstanceId,
item.ActivityCode,
item.TokenId,
approval,
false, //不应该强制结束后续
approval,
true,
null);
this.Engine.WorkflowInstanceManager.SendMessage(endMessage);