public bool startWorkflow( string workflowCode, string userCode, bool finishStart, List <DataItemParam> paramValues) { //ValidateSoapHeader(); string workItemID, keyItem, errorMessage; workItemID = keyItem = errorMessage = string.Empty; try { // 获取模板 OThinker.H3.WorkflowTemplate.PublishedWorkflowTemplateHeader workflowTemplate = GetWorkflowTemplate(workflowCode); if (workflowTemplate == null) { return(false); } // 查找流程发起人 OThinker.Organization.User user = this.Engine.Organization.GetUserByCode(userCode) as Organization.User; if (user == null) { return(false); } 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, this.Engine.BizBus, schema, OThinker.Organization.User.AdministratorID, OThinker.Organization.OrganizationUnit.DefaultRootID); if (paramValues != null) { // 这里可以在创建流程的时候赋值 //foreach (DataItemParam param in paramValues) //{ // if (bo.Schema.ContainsField(param.ItemName)) // { // bo[param.ItemName] = param.ItemValue; // } //} List <OThinker.H3.DataModel.BizObject> details = null; foreach (DataItemParam param in paramValues) { if (!(details != null && details.Count > 0 && details[0].Schema.SchemaCode == param.ItemName)) { details = new List <OThinker.H3.DataModel.BizObject>(); } OThinker.H3.DataModel.PropertySchema property = schema.GetProperty(param.ItemName); if (property == null) { continue; } SetItemValue(bo, property, param.ItemValue, details, param.ItemName); } } bo.Create(); // 创建流程实例 string InstanceId = this.Engine.InstanceManager.CreateInstance( bo.ObjectID, workflowTemplate.WorkflowCode, workflowTemplate.WorkflowVersion, null, null, user.UnitID, 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, null, paramTables, Instance.PriorityType.Normal, true, null, false, OThinker.H3.Instance.Token.UnspecifiedID, null); Engine.InstanceManager.SendMessage(startInstanceMessage); } catch (Exception ex) { return(false); } return(true); }
/// <summary> /// 创建一个新的流程实例 /// </summary> /// <param name="Engine">引擎实例对象</param> /// <param name="BizObjectId">业务对象ID</param> /// <param name="Workflow">流程模板</param> /// <param name="Schema">数据模型结构</param> /// <param name="InstanceId">流程实例ID</param> /// <param name="Originator">发起人</param> /// <param name="OriginatedJob">发起人使用的角色</param> /// <param name="InstanceName">流程实例名称</param> /// <param name="Priority">紧急程度</param> /// <param name="OriginatingInstance">发起流程的事件接口</param> /// <param name="ParameterTable">发起流程的参数表</param> /// <param name="Request">HttpRequest</param> /// <param name="WorkItemId">返回工作任务ID</param> /// <param name="ErrorMessage">错误消息</param> /// <param name="FinishStartActivity">是否结束第一个活动</param> /// <returns>返回创建流程是否成功</returns> public static bool OriginateInstance( IEngine Engine, string BizObjectId, WorkflowTemplate.PublishedWorkflowTemplate Workflow, DataModel.BizObjectSchema Schema, ref string InstanceId, string Originator, string OriginatedJob, string InstanceName, Instance.PriorityType Priority, EventHandler <OriginateInstanceEventArgs> OriginatingInstance, Dictionary <string, object> ParameterTable, System.Web.HttpRequest Request, ref string WorkItemId, ref string ErrorMessage, bool FinishStartActivity) { if (Workflow == null) { ErrorMessage = Configs.Global.ResourceManager.GetString("SheetUtility_WorkflowNotExist"); return(false); } // 创建流程实例 InstanceId = AppUtility.Engine.InstanceManager.CreateInstance( BizObjectId, Workflow.WorkflowCode, Workflow.WorkflowVersion, InstanceId, InstanceName, Originator, OriginatedJob, false, Instance.InstanceContext.UnspecifiedID, null, Instance.Token.UnspecifiedID); // 设置紧急程度为普通 OThinker.H3.Messages.MessageEmergencyType emergency = Messages.MessageEmergencyType.Normal; // 如果是发起后需要用户填写表单的模式,则紧急程度为高 if (Workflow.StartWithSheet) { emergency = OThinker.H3.Messages.MessageEmergencyType.High; } // 解析流程参数 System.Collections.Generic.Dictionary <string, object> instanceParams = ParameterTable; if (instanceParams == null) { instanceParams = new Dictionary <string, object>(); } // Http Request Parameters ParseRequestParams(Request, Workflow, Schema, instanceParams); // 调用发起事件 OriginateInstanceEventArgs originateArgs = new OriginateInstanceEventArgs(InstanceId, instanceParams); if (OriginatingInstance != null) { OriginatingInstance(OriginatingInstance, originateArgs); } WorkItemId = Guid.NewGuid().ToString().ToLower(); // 启动流程的消息 OThinker.H3.Messages.StartInstanceMessage startInstanceMessage = new OThinker.H3.Messages.StartInstanceMessage( emergency, InstanceId, WorkItemId, originateArgs == null ? null : originateArgs.InstanceParameterTable.Count == 0 ? null : originateArgs.InstanceParameterTable, Priority, false, OThinker.H3.Instance.Token.UnspecifiedID, null); Engine.InstanceManager.SendMessage(startInstanceMessage); if (!Workflow.StartWithSheet) { // 返回工作项为空 WorkItemId = H3.WorkItem.WorkItem.NullWorkItemID; return(true); } // 查找新创建的工作项 string[] jobs = null; for (int triedTimes = 0; triedTimes < 30; triedTimes++) { System.Threading.Thread.Sleep(500); if (AppUtility.Engine.WorkItemManager.GetWorkItem(WorkItemId) != null) { WorkItem.WorkItem item = AppUtility.Engine.WorkItemManager.GetWorkItem(WorkItemId); jobs = new string[] { item.WorkItemID }; break; } } if (jobs == null || jobs.Length == 0) { ErrorMessage = Configs.Global.ResourceManager.GetString("SheetUtility_OriginateFailed"); WorkItemId = OThinker.H3.WorkItem.WorkItem.NullWorkItemID; return(false); } else { // 返回新创建的工作项 WorkItemId = jobs[0]; if (FinishStartActivity) { OThinker.H3.WorkItem.WorkItem item = Engine.WorkItemManager.GetWorkItem(WorkItemId); // 结束掉第一个活动 Engine.WorkItemManager.FinishWorkItem( WorkItemId, Originator, Request.Browser.IsMobileDevice ? WorkItem.AccessPoint.Mobile : WorkItem.AccessPoint.Web, OriginatedJob, OThinker.Data.BoolMatchValue.Unspecified, null, null, WorkItem.ActionEventType.Forward, WorkItem.WorkItem.UnspecifiedActionButtonType); OThinker.H3.Messages.AsyncEndMessage endMessage = new Messages.AsyncEndMessage( Messages.MessageEmergencyType.Normal, InstanceId, item.ActivityCode, item.TokenId, OThinker.Data.BoolMatchValue.Unspecified, false, OThinker.Data.BoolMatchValue.Unspecified, true, null); Engine.InstanceManager.SendMessage(endMessage); } return(true); } }
/// <summary> /// 启动流程实例 /// </summary> /// <param name="workflowCode"></param> /// <param name="userCode"></param> /// <param name="finishStart"></param> /// <param name="paramValues"></param> /// <returns></returns> public BPMServiceResult StartWorkflow(string workflowCode, string userCode, bool finishStart, List <DataItemParam> paramValues) { //ValidateSoapHeader(); BPMServiceResult result = new BPMServiceResult(); try { // 获取模板 OThinker.H3.WorkflowTemplate.PublishedWorkflowTemplateHeader workflowTemplate = GetWorkflowTemplate(workflowCode); if (workflowTemplate == null) { return(new BPMServiceResult(false, "流程启动失败,流程模板不存在,模板编码:" + workflowCode + "。")); } // 查找流程发起人 //OThinker.Organization.User user = Engine.Organization.GetUnitByCode(userCode) as Organization.User; string user = GetUserIDByCode(userCode); if (user == null) { return(new BPMServiceResult(false, "流程启动失败,用户{" + userCode + "}不存在。")); } OThinker.H3.DataModel.BizObjectSchema schema = Engine.BizObjectManager.GetPublishedSchema(workflowTemplate.BizObjectSchemaCode); OThinker.H3.DataModel.BizObject bo = new OThinker.H3.DataModel.BizObject(Engine.Organization, Engine.MetadataRepository, Engine.BizObjectManager, null, schema, user); if (paramValues != null) { // 这里可以在创建流程的时候赋值 foreach (DataItemParam param in paramValues) { if (bo.Schema.GetProperty(param.ItemName).LogicType == OThinker.H3.Data.DataLogicType.BizObjectArray) { var t = new List <OThinker.H3.DataModel.BizObject>(); foreach (List <DataItemParam> list in (IEnumerable)param.ItemValue) { var m = new OThinker.H3.DataModel.BizObject(Engine.Organization, Engine.MetadataRepository, Engine.BizObjectManager, null, schema.Fields.FirstOrDefault(x => x.ChildSchemaCode == param.ItemName).Schema, user); foreach (DataItemParam item in list) { if (m.Schema.ContainsField(item.ItemName)) { m.SetValue(item.ItemName, item.ItemValue); } } t.Add(m); } bo[param.ItemName] = t.ToArray(); } else 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,null, null, false, OThinker.H3.Instance.InstanceContext.UnspecifiedID,null,OThinker.H3.Instance.Token.UnspecifiedID); string InstanceId = this.Engine.InstanceManager.CreateInstanceByDefault(bo.ObjectID, workflowTemplate.WorkflowCode, null, user); // 设置紧急程度为普通 OThinker.H3.Messages.MessageEmergencyType emergency = OThinker.H3.Messages.MessageEmergencyType.Normal; // 这里也可以在启动流程的时候赋值 Dictionary <string, object> paramTables = new Dictionary <string, object>(); // 启动流程的消息 OThinker.H3.Messages.StartInstanceMessage startInstanceMessage = new OThinker.H3.Messages.StartInstanceMessage(emergency, InstanceId, null, paramTables, OThinker.H3.Instance.PriorityType.Normal, true, null, false, OThinker.H3.Instance.Token.UnspecifiedID, null); Engine.InstanceManager.SendMessage(startInstanceMessage); result = new BPMServiceResult(true, InstanceId, null, "流程实例启动成功!", ""); } catch (Exception ex) { result = new BPMServiceResult(false, "流程实例启动失败!错误:" + ex.Message); } return(result); }
/// <summary> /// 启动H3流程实例(包含子表) /// </summary> /// <typeparam name="T">实体类-泛型</typeparam> /// <param name="workflowCode">流程模板编码</param> /// <param name="userCode">启动流程的用户编码</param> /// <param name="finishStart">是否结束第一个活动</param> /// <param name="EntityParamValues">流程实例启动初始化数据项实体类集合</param> /// <returns></returns> private BPMServiceResult startWorkflowByEntityTrinsJson( string workflowCode, string userCode, bool finishStart, object EntityParamValues) { 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 = OThinker.H3.Controllers.AppUtility.Engine.Organization.GetUserByCode(userCode) as OThinker.Organization.User; string user = "******";// GetUserIDByCode(userCode); //"18f923a7-5a5e-426d-94ae-a55ad1a4b239"; // if (user == null) { result = new BPMServiceResult(false, "流程启动失败,用户{" + userCode + "}不存在。"); return(result); } OThinker.H3.DataModel.BizObjectSchema schema = OThinker.H3.Controllers.AppUtility.Engine.BizObjectManager.GetPublishedSchema(workflowTemplate.BizObjectSchemaCode); OThinker.H3.DataModel.BizObject bo = new OThinker.H3.DataModel.BizObject( OThinker.H3.Controllers.AppUtility.Engine.Organization, OThinker.H3.Controllers.AppUtility.Engine.MetadataRepository, OThinker.H3.Controllers.AppUtility.Engine.BizObjectManager, OThinker.H3.Controllers.AppUtility.Engine.BizBus, schema, OThinker.Organization.User.AdministratorID, OThinker.Organization.OrganizationUnit.DefaultRootID); if (EntityParamValues != null) { Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(EntityParamValues.ToString()); foreach (KeyValuePair <string, Newtonsoft.Json.Linq.JToken> jo in jObject) { //如果字段是GTAttachment则是附件 if (bo.Schema.ContainsField(jo.Key)) { if (bo.Schema.GetLogicType(jo.Key) == OThinker.H3.Data.DataLogicType.Comment) { continue; } //判断是否子表 else if (bo.Schema.GetLogicType(jo.Key) != OThinker.H3.Data.DataLogicType.BizObjectArray) { //给对象赋值 bo[jo.Key] = jo.Value; } else { List <object> list = JSSerializer.Deserialize <List <object> >(Newtonsoft.Json.JsonConvert.SerializeObject(jo.Value) as string); //获取子表的属性 BizObjectSchema childSchema = schema.GetProperty(jo.Key).ChildSchema; BizObject[] bizObjects = new BizObject[list.Count]; int i = 0; foreach (object objT in list) { bizObjects[i] = new BizObject(OThinker.H3.Controllers.AppUtility.Engine, childSchema, userCode); foreach (KeyValuePair <string, object> t in (dynamic)objT) { if (childSchema.ContainsField(t.Key)) { //给对象赋值 bizObjects[i][t.Key] = t.Value; continue; } } i++; } //子表回写给流程子表 bo[jo.Key] = bizObjects; } } } } bo.Create(); // 创建流程实例 string InstanceId = OThinker.H3.Controllers.AppUtility.Engine.InstanceManager.CreateInstance( bo.ObjectID, workflowTemplate.WorkflowCode, workflowTemplate.WorkflowVersion, null, null, user, null, false, OThinker.H3.Instance.InstanceContext.UnspecifiedID, null, OThinker.H3.Instance.Token.UnspecifiedID); // 设置紧急程度为普通 OThinker.H3.Messages.MessageEmergencyType emergency = OThinker.H3.Messages.MessageEmergencyType.Normal; // 这里也可以在启动流程的时候赋值 Dictionary <string, object> paramTables = new Dictionary <string, object>(); // 启动流程的消息 OThinker.H3.Messages.StartInstanceMessage startInstanceMessage = new OThinker.H3.Messages.StartInstanceMessage( emergency, InstanceId, workItemID, paramTables, OThinker.H3.Instance.PriorityType.Normal, true, null, false, OThinker.H3.Instance.Token.UnspecifiedID, null); OThinker.H3.Controllers.AppUtility.Engine.InstanceManager.SendMessage(startInstanceMessage); result = new BPMServiceResult(true, InstanceId, workItemID, "流程实例启动成功!", ""); } catch (Exception ex) { result = new BPMServiceResult(false, "流程实例启动失败!错误:" + ex + string.Empty); } return(result); }