流程接口示例
<%@ WebService Language="C#" Class="OThinker.H3.Portal.BPMService" %> using System; using System.Collections.Generic; using System.Web; using System.Web.Services; using System.Data; namespace OThinker.H3.Portal { /// <summary> /// 流程实例操作相关接口 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.None)] //若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class BPMService : System.Web.Services.WebService { /// <summary> /// 构造函数 /// </summary> public BPMService() { //如果使用设计的组件,请取消注释以下行 //InitializeComponent(); } private IEngine _Engine = null; /// <summary> /// 流程引擎的接口,该接口会比this.Engine的方式更快,因为其中使用了缓存 /// </summary> public IEngine Engine { get { if (OThinker.H3.WorkSheet.AppConfig.ConnectionMode == ConnectionStringParser.ConnectionMode.Mono) { return OThinker.H3.WorkSheet.AppUtility.Engine; } return _Engine; } set { _Engine = value; } } /// <summary> /// 查询对象 /// </summary> protected Query Query { get { return this.Engine.Query; } } /// <summary> /// 获取用户的待办任务总数 /// </summary> /// <returns></returns> [WebMethod(Description = "获取用户未完成的任务总数")] [System.Web.Services.Protocols.SoapHeader("authentication")] public int GetUserUnfinishedWorkItemCount() { ValidateSoapHeader(); int recordCounts; // 构造查询用户帐号的条件 string[] conditions = Query.GetWorkItemConditions( UserValidator.UserID, true, H3.WorkItem.WorkItemState.Unfinished, H3.WorkItem.WorkItemType.Unspecified, OThinker.Data.BoolMatchValue.Unspecified, OThinker.Data.BoolMatchValue.Unspecified); // 获取总记录数,计算页码 recordCounts = this.Engine.Query.CountWorkItem(conditions); return recordCounts; } /// <summary> /// 获取用户的已办任务总数 /// </summary> /// <returns></returns> [WebMethod(Description = "获取用户已完成的任务总数")] [System.Web.Services.Protocols.SoapHeader("authentication")] public int GetUserFinishedWorkItemCount() { ValidateSoapHeader(); int recordCounts; // 构造查询用户帐号的条件 string[] conditions = Query.GetWorkItemConditions( UserValidator.UserID, true, H3.WorkItem.WorkItemState.Finished, H3.WorkItem.WorkItemType.Unspecified, OThinker.Data.BoolMatchValue.Unspecified, OThinker.Data.BoolMatchValue.Unspecified); // 获取总记录数,计算页码 recordCounts = this.Engine.Query.CountWorkItem(conditions); return recordCounts; } /// <summary> /// 提交(已阅)工作任务 /// </summary> /// <param name="workItemId"></param> /// <param name="commentText"></param> /// <returns></returns> [WebMethod(Description = "提交(已阅)工作任务")] [System.Web.Services.Protocols.SoapHeader("authentication")] public bool SubmitWorkItem(string workItemId, string commentText) { ValidateSoapHeader(); // 获取操作的用户 WorkItem.WorkItem item = this.Engine.WorkItemManager.GetWorkItem(workItemId); SubmitItem(workItemId, OThinker.Data.BoolMatchValue.True, commentText, UserValidator.UserID); return true; } /// <summary> /// 驳回工作任务 /// </summary> /// <param name="workItemId"></param> /// <param name="commentText"></param> /// <returns></returns> [WebMethod(Description = "驳回工作任务")] [System.Web.Services.Protocols.SoapHeader("authentication")] public bool ReturnWorkItem(string workItemId, string commentText) { ValidateSoapHeader(); // 获取操作的用户 WorkItem.WorkItem item = this.Engine.WorkItemManager.GetWorkItem(workItemId); ReturnItem(UserValidator.UserID, workItemId, commentText); return true; } /// <summary> /// 结束流程 /// </summary> /// <param name="instanceId">流程实例ID</param> /// <returns></returns> [WebMethod(Description = "强制结束流程")] [System.Web.Services.Protocols.SoapHeader("authentication")] public bool FinishInstance(string instanceId) { ValidateSoapHeader(); // 获取操作的用户 Instance.InstanceContext context = this.Engine.InstanceManager.GetInstanceContext(instanceId); if (context == null) return false; WorkflowTemplate.PublishedWorkflowTemplate workflow = this.Engine.WorkflowManager.GetDefaultWorkflow(context.WorkflowCode); Messages.ActivateActivityMessage activateMessage = new Messages.ActivateActivityMessage( Messages.MessageEmergencyType.High, instanceId, workflow.EndActivityCode, OThinker.H3.Instance.Token.UnspecifiedID, null, null, false, WorkItem.ActionEventType.Adjust ); this.Engine.InstanceManager.SendMessage(activateMessage); return true; } /// <summary> /// 激活流程 /// </summary> /// <param name="instanceId">流程实例ID</param> /// <returns></returns> [WebMethod(Description = "激活流程")] [System.Web.Services.Protocols.SoapHeader("authentication")] public bool ActiveInstance(string instanceId) { ValidateSoapHeader(); // 获取操作的用户 OThinker.H3.Messages.ActivateInstanceMessage activateMessage = new OThinker.H3.Messages.ActivateInstanceMessage(instanceId); this.Engine.InstanceManager.SendMessage(activateMessage); return true; } /// <summary> /// 激活指定的活动节点 /// </summary> /// <param name="instanceId">流程实例ID</param> /// <param name="activityCode">活动节点</param> /// <param name="participants">活动参与者,可以指定参与者,如果为空那么取流程默认配置</param> /// <returns></returns> [WebMethod(Description = "激活指定的活动节点")] [System.Web.Services.Protocols.SoapHeader("authentication")] public bool ActiveToken(string instanceId, string activityCode, string[] participants) { ValidateSoapHeader(); // 准备触发后面Activity的消息 OThinker.H3.Messages.ActivateActivityMessage activateMessage = new OThinker.H3.Messages.ActivateActivityMessage( OThinker.H3.Messages.MessageEmergencyType.Normal, instanceId, activityCode, OThinker.H3.Instance.Token.UnspecifiedID, participants, null, false, H3.WorkItem.ActionEventType.Adjust); this.Engine.InstanceManager.SendMessage(activateMessage); return true; } /// <summary> /// 取消指定的活动节点 /// </summary> /// <param name="instanceId">流程实例ID</param> /// <param name="activityCode">活动节点</param> /// <returns></returns> [WebMethod(Description = "取消指定的活动节点")] [System.Web.Services.Protocols.SoapHeader("authentication")] public bool CancelToken(string instanceId, string activityCode) { ValidateSoapHeader(); // 准备触发后面Activity的消息 OThinker.H3.Messages.CancelActivityMessage cancelMessage = new Messages.CancelActivityMessage(Messages.MessageEmergencyType.Normal, instanceId, activityCode, false); this.Engine.InstanceManager.SendMessage(cancelMessage); return true; } /// <summary> /// 取回工作任务 /// </summary> /// <param name="workitemId">工作任务ID</param> /// <returns></returns> [WebMethod(Description = "取回工作任务")] [System.Web.Services.Protocols.SoapHeader("authentication")] public bool RetrieveWorkItem(string workitemId) { ValidateSoapHeader(); //获取工作项信息 OThinker.H3.WorkItem.WorkItem workItem = this.Engine.WorkItemManager.GetWorkItem(workitemId); // 检查是否能够取回 if (workItem == null) return false; OThinker.H3.Instance.InstanceContext context = this.Engine.InstanceManager.GetInstanceContext(workItem.InstanceId); // 获得当前的Token是否存在多个分支 OThinker.H3.Instance.IToken currentToken = context.GetToken(workItem.TokenId); if (currentToken == null) return false; // 获得后继的Token int[] postTokenIds = context.GetPostTokens(workItem.TokenId); // 发送回退消息 if (postTokenIds == null || postTokenIds.Length == 0) return false; else if (postTokenIds.Length > 1) return false; int postTokenId = postTokenIds[0]; OThinker.H3.Instance.IToken postToken = context.GetToken(postTokenId); if (!postToken.Retrievable) return false; // 具备取回的条件 // 记录操作日志 //无此用户 OThinker.H3.WorkflowTemplate.PublishedWorkflowTemplateHeader worflowTemplate = this.Engine.WorkflowManager.GetPublishedTemplateHeader(workItem.WorkflowCode, workItem.WorkflowVersion); // 记录操作用户ID OThinker.H3.Tracking.UserLog log = new OThinker.H3.Tracking.UserLog( Tracking.UserLogType.Retrieve, UserValidator.UserID, workItem.BizObjectId, worflowTemplate.BizObjectSchemaCode, workItem.InstanceId, workItem.WorkItemID, workItem.DisplayName, null, null, null, null); this.Engine.UserLogWriter.Write(log); // 发送取回消息 OThinker.H3.Messages.CancelActivityMessage rollback = new OThinker.H3.Messages.CancelActivityMessage( OThinker.H3.Messages.MessageEmergencyType.Normal, workItem.InstanceId, postToken.Activity, true); this.Engine.InstanceManager.SendMessage(rollback); return true; } /// <summary> /// 启动H3流程实例,设置主键数据项的值(私有云接口) /// </summary> /// <param name="workflowCode"></param> /// <param name="userAlias"></param> /// <param name="finishStart"></param> /// <param name="keyName"></param> /// <param name="keyValue"></param> /// <returns></returns> [WebMethod(Description = "启动H3流程实例,设置主键数据项的值")] public BPMServiceResult StartWorkflowWithKey( string workflowCode, string userAlias, bool finishStart, string keyName, string keyValue) { List<DataItemParam> paramValues = new List<DataItemParam>(); if (!string.IsNullOrEmpty(keyName)) { paramValues.Add(new DataItemParam() { ItemName = keyName, ItemValue = keyValue }); } return startWorkflow(workflowCode, userAlias, finishStart, paramValues); } /// <summary> /// 启动H3流程实例 /// </summary> /// <param name="workflowCode">流程模板编码</param> /// <param name="userCode">启动流程的用户编码</param> /// <param name="finishStart">是否结束第一个活动</param> /// <param name="paramValues">流程实例启动初始化数据项集合</param> /// <returns></returns> [System.Web.Services.Protocols.SoapHeader("authentication")] [WebMethod(Description = "启动H3流程实例")] public BPMServiceResult StartWorkflow( string workflowCode, string userCode, bool finishStart, List<DataItemParam> paramValues) { ValidateSoapHeader(); return startWorkflow(workflowCode, userCode, finishStart, paramValues); } /// <summary> /// 设置单个流程数据项的值 /// </summary> /// <param name="bizObjectSchemaCode"></param> /// <param name="bizObjectId"></param> /// <param name="keyName"></param> /// <param name="keyValue"></param> /// <returns></returns> [WebMethod(Description = "设置单个流程数据项的值")] [System.Web.Services.Protocols.SoapHeader("authentication")] public bool SetItemValue(string bizObjectSchemaCode, string bizObjectId, string keyName, object keyValue) { ValidateSoapHeader(); List<DataItemParam> keyValues = new List<DataItemParam>(); keyValues.Add(new DataItemParam() { ItemName = keyName, ItemValue = keyValue }); return SetItemValues(bizObjectSchemaCode, bizObjectId, keyValues); } /// <summary> /// 设置批量流程数据项的值 /// </summary> /// <param name="bizObjectSchemaCode"></param> /// <param name="bizObjectId"></param> /// <param name="keyValues"></param> /// <returns></returns> [WebMethod(Description = "设置批量流程数据项的值")] [System.Web.Services.Protocols.SoapHeader("authentication")] public bool SetItemValues(string bizObjectSchemaCode, string bizObjectId, List<DataItemParam> keyValues) { ValidateSoapHeader(); // 获取操作的用户 if (keyValues == null || keyValues.Count == 0) return false; Dictionary<string, object> values = new Dictionary<string, object>(); foreach (DataItemParam param in keyValues) { values.Add(param.ItemName, param.ItemValue); } return this.Engine.BizObjectManager.SetPropertyValues(bizObjectSchemaCode, bizObjectId, UserValidatorFactory.CurrentUser.UserID, values); } /// <summary> /// 输出日志至引擎服务器 /// </summary> /// <param name="message"></param> [WebMethod(Description = "输出日志至引擎服务器")] public void WriteLog(string message) { this.Engine.LogWriter.Write(message); } #region 工作任务私有方法 ---------------- /// <summary> /// 提交工作项 /// </summary> /// <param name="workItemId">工作项ID</param> /// <param name="approval">审批结果</param> /// <param name="commentText">审批意见</param> /// <param name="userId">处理人</param> private void SubmitItem(string workItemId, OThinker.Data.BoolMatchValue approval, string commentText, string userId) { // 获取工作项 OThinker.H3.WorkItem.WorkItem item = this.Engine.WorkItemManager.GetWorkItem(workItemId); // 添加意见 this.AppendComment(item, OThinker.Data.BoolMatchValue.Unspecified, commentText); // 结束工作项 this.Engine.WorkItemManager.FinishWorkItem( item.ObjectID, userId, OThinker.H3.WorkItem.AccessPoint.ExternalSystem, null, null, approval, commentText, null, OThinker.H3.WorkItem.ActionEventType.Forward, (int)OThinker.H3.WorkSheet.SheetButtonType.Submit); // 需要通知实例事件管理器结束事件 Messages.AsyncEndMessage endMessage = new OThinker.H3.Messages.AsyncEndMessage( Messages.MessageEmergencyType.Normal, item.InstanceId, item.ActivityCode, item.TokenId, approval, false, approval, true, null); this.Engine.InstanceManager.SendMessage(endMessage); } /// <summary> /// 驳回工作任务 /// </summary> /// <param name="userId"></param> /// <param name="workItemId"></param> /// <param name="commentText"></param> /// <returns></returns> private bool ReturnItem(string userId, string workItemId, string commentText) { Organization.User user = this.Engine.Organization.GetUnit(userId) as Organization.User; if (user == null) return false; // 获取工作项 OThinker.H3.WorkItem.WorkItem item = this.Engine.WorkItemManager.GetWorkItem(workItemId); OThinker.H3.Instance.InstanceContext context = this.Engine.InstanceManager.GetInstanceContext(item.InstanceId); // ToKen OThinker.H3.Instance.IToken Token = context.GetToken(item.TokenId); int PreToken = int.Parse(Token.PreTokens[0].ToString()); OThinker.H3.Instance.IToken PreToken1 = context.GetToken(PreToken); string activityName = PreToken1.Activity; // 添加意见 this.AppendComment(item, OThinker.Data.BoolMatchValue.False, commentText); // 结束工作项 this.Engine.WorkItemManager.FinishWorkItem( item.ObjectID, user.ObjectID, H3.WorkItem.AccessPoint.ExternalSystem, null, null, OThinker.Data.BoolMatchValue.False, commentText, null, H3.WorkItem.ActionEventType.Backward, (int)OThinker.H3.WorkSheet.SheetButtonType.Return); // 准备触发后面Activity的消息 OThinker.H3.Messages.ActivateActivityMessage activateMessage = new OThinker.H3.Messages.ActivateActivityMessage( OThinker.H3.Messages.MessageEmergencyType.Normal, item.InstanceId, activityName, OThinker.H3.Instance.Token.UnspecifiedID, null, new int[] { item.TokenId }, false, H3.WorkItem.ActionEventType.Backward); // 通知该Activity已经完成 OThinker.H3.Messages.AsyncEndMessage endMessage = new OThinker.H3.Messages.AsyncEndMessage( OThinker.H3.Messages.MessageEmergencyType.Normal, item.InstanceId, item.ActivityCode, item.TokenId, OThinker.Data.BoolMatchValue.False, true, OThinker.Data.BoolMatchValue.False, false, activateMessage); this.Engine.InstanceManager.SendMessage(endMessage); return true; } private BPMServiceResult startWorkflow( string workflowCode, string userCode, bool finishStart, List<DataItemParam> paramValues) { ValidateSoapHeader(); string workItemID, keyItem, errorMessage; workItemID = keyItem = errorMessage = string.Empty; BPMServiceResult result; try { // 获取模板 OThinker.H3.WorkflowTemplate.PublishedWorkflowTemplateHeader workflowTemplate = GetWorkflowTemplate(workflowCode); if (workflowTemplate == null) { result = new BPMServiceResult(false, "流程启动失败,流程模板不存在,模板编码:" + workflowCode + "。"); return result; } // 查找流程发起人 OThinker.Organization.User user = this.Engine.Organization.GetUnitByCode(userCode) as Organization.User; if (user == null) { result = new BPMServiceResult(false, "流程启动失败,用户{" + userCode + "}不存在。"); return result; } OThinker.H3.DataModel.BizObjectSchema schema = this.Engine.BizObjectManager.GetPublishedSchema(workflowTemplate.BizObjectSchemaCode); OThinker.H3.DataModel.BizObject bo = new DataModel.BizObject( this.Engine.Organization, this.Engine.MetadataRepository, this.Engine.BizObjectManager, schema, OThinker.Organization.User.SystemUserID, OThinker.Organization.Company.DefaultCompanyId); if (paramValues != null) { // 这里可以在创建流程的时候赋值 foreach (DataItemParam param in paramValues) { if (bo.Schema.ContainsField(param.ItemName)) { bo[param.ItemName] = param.ItemValue; } } } bo.Create(); // 创建流程实例 string InstanceId = this.Engine.InstanceManager.CreateInstance( bo.ObjectID, workflowTemplate.WorkflowCode, workflowTemplate.WorkflowVersion, null, null, user.UnitID, null, // 以组的身份发起 null, // 以岗位的身份发起 false, // Instance.InstanceContext.UnspecifiedID, null, Instance.Token.UnspecifiedID); // 设置紧急程度为普通 OThinker.H3.Messages.MessageEmergencyType emergency = Messages.MessageEmergencyType.Normal; // 这里也可以在启动流程的时候赋值 Dictionary<string, object> paramTables = new Dictionary<string, object>(); // 启动流程的消息 OThinker.H3.Messages.StartInstanceMessage startInstanceMessage = new OThinker.H3.Messages.StartInstanceMessage( emergency, InstanceId, paramTables, Instance.PriorityType.Normal, true, null, false, OThinker.H3.Instance.Token.UnspecifiedID, null); Engine.InstanceManager.SendMessage(startInstanceMessage); result = new BPMServiceResult(true, InstanceId, workItemID, "流程实例启动成功!", ""); } catch (Exception ex) { result = new BPMServiceResult(false, "流程实例启动失败!错误:" + ex.ToString()); } return result; } /// <summary> /// 给工作项添加审批意见 /// </summary> /// <param name="item">工作项</param> /// <param name="approval">审批结果</param> /// <param name="commentText">审批意见</param> private void AppendComment(OThinker.H3.WorkItem.WorkItem item, OThinker.Data.BoolMatchValue approval, string commentText) { // 添加一个审批意见 WorkflowTemplate.PublishedWorkflowTemplate workflow = this.Engine.WorkflowManager.GetPublishedTemplate( item.WorkflowCode, item.WorkflowVersion); // 审批字段 string approvalDataItem = null; if (workflow != null) { OThinker.H3.DataModel.BizObjectSchema schema = this.Engine.BizObjectManager.GetPublishedSchema(item.BizObjectSchemaCode); approvalDataItem = workflow.GetDefaultCommentDataItem(schema, item.ActivityCode); } if (approvalDataItem != null) { // 创建审批 OThinker.H3.Data.Comment comment = new Data.Comment(); comment.Activity = item.ActivityCode; comment.Approval = approval; comment.CreatedTime = System.DateTime.Now; comment.DataField = approvalDataItem; comment.InstanceId = item.InstanceId; comment.BizObjectId = item.BizObjectId; comment.BizObjectSchemaCode = item.BizObjectSchemaCode; comment.OUName = this.Engine.Organization.GetName(this.Engine.Organization.GetParent(item.Participant)); comment.Text = commentText; comment.TokenId = item.TokenId; comment.UserID = item.Participant; // 设置用户的默认签章 Organization.Signature[] signs = this.Engine.Organization.GetSignaturesByUnit(item.Participant); if (signs != null && signs.Length > 0) { foreach (Organization.Signature sign in signs) { if (sign.IsDefault) { comment.SignatureId = sign.ObjectID; break; } } } this.Engine.BizObjectManager.AddComment(comment); } } #endregion /// <summary> /// 获取最新的流程模板 /// </summary> /// <param name="workflowCode">流程模板编码</param> /// <returns></returns> private OThinker.H3.WorkflowTemplate.PublishedWorkflowTemplateHeader GetWorkflowTemplate(string workflowCode) { // 获取最新版本号 int workflowVersion = this.Engine.WorkflowManager.GetWorkflowDefaultVersion(workflowCode); return GetWorkflowTemplate(workflowCode, workflowVersion); } /// <summary> /// 获取指定版本号的流程模板对象 /// </summary> /// <param name="workflowCode">流程模板编码</param> /// <param name="workflowVersion">流程模板版本号</param> /// <returns></returns> private OThinker.H3.WorkflowTemplate.PublishedWorkflowTemplateHeader GetWorkflowTemplate(string workflowCode, int workflowVersion) { // 获取模板 OThinker.H3.WorkflowTemplate.PublishedWorkflowTemplateHeader workflowTemplate = this.Engine.WorkflowManager.GetPublishedTemplateHeader( workflowCode, workflowVersion); return workflowTemplate; } public Authentication authentication; public Acl.UserValidator UserValidator = null; /// <summary> /// 验证当前用户是否正确 /// </summary> /// <returns></returns> public void ValidateSoapHeader() { if (authentication == null) { throw new Exception("请输入身份认证信息!"); } UserValidator = UserValidatorFactory.Validate(authentication.UserCode, authentication.Password); if (UserValidator == null) { throw new Exception("帐号或密码不正确!"); } this.Engine = UserValidator.Engine; // this.Engine = OThinker.H3.WorkSheet.AppUtility.Engine; } } /// <summary> /// 身份验证类 /// </summary> public class Authentication : System.Web.Services.Protocols.SoapHeader { public Authentication() { } public Authentication(string UserCode, string Password) { this.UserCode = UserCode; this.Password = Password; } public string UserCode { get; set; } public string Password { get; set; } } /// <summary> /// 流程服务返回消息类 /// </summary> public class BPMServiceResult { /// <summary> /// 消息类构造函数 /// </summary> /// <param name="success"></param> /// <param name="instanceId"></param> /// <param name="workItemId"></param> /// <param name="message"></param> public BPMServiceResult(bool success, string instanceId, string workItemId, string message, string WorkItemUrl) { this.Success = success; this.InstanceID = instanceId; this.Message = message; this.WorkItemID = workItemId; this.WorkItemUrl = WorkItemUrl; } /// <summary> /// 消息类构造函数 /// </summary> /// <param name="success"></param> /// <param name="message"></param> public BPMServiceResult(bool success, string message) : this(success, string.Empty, string.Empty, message, string.Empty) { } public BPMServiceResult() { } private bool success = false; /// <summary> /// 获取或设置流程启动是否成功 /// </summary> public bool Success { get { return success; } set { success = value; } } private string instanceId = string.Empty; /// <summary> /// 获取或设置启动的流程实例ID /// </summary> public string InstanceID { get { return instanceId; } set { this.instanceId = value; } } private string message = string.Empty; /// <summary> /// 获取或设置系统返回消息 /// </summary> public string Message { get { return message; } set { this.message = value; } } private string workItemId = string.Empty; /// <summary> /// 获取或设置第一个节点的ItemID /// </summary> public string WorkItemID { get { return workItemId; } set { this.workItemId = value; } } private string workItemUrl = string.Empty; /// <summary> /// 获取或设置第一个节点的url /// </summary> public string WorkItemUrl { get { return workItemUrl; } set { this.workItemUrl = value; } } } /// <summary> /// 提交任务后返回对象 /// </summary> [Serializable] public class ReturnWorkItemInfo { public ReturnWorkItemInfo() { } private bool isSuccess = false; /// <summary> /// 是否提交成功 /// </summary> public bool IsSuccess { get { return isSuccess; } set { this.isSuccess = value; } } private string workItemUrl = string.Empty; /// <summary> /// 当前表单地址 /// </summary> public string WorkItemUrl { get { return workItemUrl; } set { this.workItemUrl = value; } } } /// <summary> /// 数据项参数 /// </summary> [Serializable] public class DataItemParam { private string itemName = string.Empty; /// <summary> /// 获取或设置数据项名称 /// </summary> public string ItemName { get { return itemName; } set { this.itemName = value; } } private object itemValue = string.Empty; /// <summary> /// 获取或设置数据项的值 /// </summary> public object ItemValue { get { return itemValue; } set { this.itemValue = value; } } } } |