/// <summary>
        /// 保存工作流实例
        /// </summary>
        /// <param name="instance"></param>
        protected override StateMachineWorkflowInstance SaveWorkflowInstance(StateMachineWorkflowInstance instance)
        {
            foreach (Activity activity in instance.ExecutedActivities)
            {
                AddApprovalActivity(activity);
            }
            NHStateMachineInstance nHInstance = dao.GetById(instance.Id, false);

            ConvertNHFromInstance(instance, nHInstance);
            dao.Save(nHInstance);
            return(instance);
        }
        /// <summary>
        /// 插入一条新的工作流
        /// </summary>
        /// <param name="instance"></param>
        protected override StateMachineWorkflowInstance InsertWorkflowInstance(StateMachineWorkflowInstance instance)
        {
            foreach (Activity activity in instance.ExecutedActivities)
            {
                AddApprovalActivity(activity);
            }
            NHStateMachineInstance nHInstance = new NHStateMachineInstance();

            nHInstance.Id = instance.Id;
            ConvertNHFromInstance(instance, nHInstance);
            dao.Save(nHInstance);
            return(instance);
        }
        /// <summary>
        /// 将NHStateMachineInstance对象反序列化为状态机工作流对象
        /// </summary>
        /// <param name="instance">The instance.</param>
        /// <param name="isAttachMore">是否需要加载其他信息:该实例所有执行动作的实例</param>
        /// <returns></returns>
        private StateMachineWorkflowInstance ConvertNHToInstance(NHStateMachineInstance instance, bool isAttachMore)
        {
            StateMachineWorkflowInstance newInstance = new StateMachineWorkflowInstance();

            newInstance.WorkflowName = instance.WorkflowName;
            newInstance.EaId         = instance.EaId;
            newInstance.Id           = instance.Id;
            if (!string.IsNullOrEmpty(instance.ParentId))
            {
                newInstance.ParentId = new Guid(instance.ParentId);
            }
            newInstance.PersistTime = instance.PersistTime;
            newInstance.Properties.Add("UnitCode", instance.CreaterUnit);
            newInstance.Properties.Add("CreaterUserId", instance.CreaterUserId);
            newInstance.StateName = instance.StateName;
            if (!string.IsNullOrEmpty(instance.Children))
            {
                string[]    childrenId  = instance.Children.Split(';');
                List <Guid> childrenIds = new List <Guid>();
                for (int i = 0; i < childrenId.Length; i++)
                {
                    Guid childId = new Guid(childrenId[i]);
                    childrenIds.Add(childId);
                }
                newInstance.ChildrenId = childrenIds;
            }
            if (!string.IsNullOrEmpty(instance.StateRecord))
            {
                string[] stateNames = instance.StateRecord.Split(';');
                newInstance.StateRecordNames = new List <string>(stateNames);
            }
            if (isAttachMore)
            {
                if (!string.IsNullOrEmpty(instance.ExecuteActivitiesIds))
                {
                    string[]    ids    = instance.ExecuteActivitiesIds.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                    List <long> allIds = new List <long>();
                    for (int i = 0; i < ids.Length; i++)
                    {
                        long activityId;
                        if (long.TryParse(ids[i], out activityId))
                        {
                            allIds.Add(activityId);
                        }
                    }
                    newInstance.ExecutedActivities.AddRange(GetApprovalActivitys(allIds.ToArray()));
                }
            }

            return(newInstance);
        }
        /// <summary>
        /// 获取某实例
        /// </summary>
        /// <param name="id">实例Id</param>
        /// <param name="isAttachMore">是否装载更多信息</param>
        /// <returns></returns>
        protected override StateMachineWorkflowInstance GetWorkflowInstance(Guid id, bool isAttachMore)
        {
            List <NHStateMachineInstance> instanceList = dao.GetInstanceById(id);

            if (instanceList == null || instanceList.Count == 0)
            {
                throw new ApplicationException(string.Format("\"{0}\" entity cannot found!", id));
            }
            else
            {
                NHStateMachineInstance nHInstance = instanceList[0];
                return(ConvertNHToInstance(nHInstance, isAttachMore));
            }
        }
        /// <summary>
        /// 将状态机工作流实例序列化转换为NHStateMachineInstance
        /// </summary>
        /// <param name="instance">The instance.</param>
        /// <param name="nHInstance">The n H instance.</param>
        private void ConvertNHFromInstance(StateMachineWorkflowInstance instance, NHStateMachineInstance nHInstance)
        {
            nHInstance.EaId = instance.EaId;
            if (instance.ParentId != Guid.Empty)
            {
                nHInstance.ParentId = instance.ParentId.ToString();
            }
            nHInstance.WorkflowName  = instance.WorkflowName;
            nHInstance.StateName     = instance.StateName;
            nHInstance.CreaterUserId = instance.Properties["CreaterUserId"];
            nHInstance.CreaterUnit   = instance.Properties["UnitCode"];
            nHInstance.PersistTime   = instance.PersistTime;
            nHInstance.TypeName      = typeof(StateMachineWorkflowInstance).Name;
            if (instance.ChildrenId != null)
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < instance.ChildrenId.Count; i++)
                {
                    if (i != 0)
                    {
                        sb.Append(";");
                    }
                    sb.Append(instance.ChildrenId[i].ToString());
                }
                nHInstance.Children = sb.ToString();
            }
            else
            {
                nHInstance.Children = string.Empty;
            }


            if (instance.ExecutedActivities != null)
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < instance.ExecutedActivities.Count; i++)
                {
                    if (i != 0)
                    {
                        sb.Append(";");
                    }
                    sb.Append(instance.ExecutedActivities[i].Id.ToString());
                }
                nHInstance.ExecuteActivitiesIds = sb.ToString();
            }
            else
            {
                nHInstance.ExecuteActivitiesIds = string.Empty;
            }


            if (instance.StateRecordNames != null)
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < instance.StateRecordNames.Count; i++)
                {
                    if (i != 0)
                    {
                        sb.Append(";");
                    }
                    sb.Append(instance.StateRecordNames[i]);
                }
                nHInstance.StateRecord = sb.ToString();
            }
            else
            {
                nHInstance.StateRecord = string.Empty;
            }
        }