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);
        }
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
        /// <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);
        }