跳转至

流程管理场景示例

重新激活流程

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);