/// <summary>
        /// 查询流程实体数据
        /// </summary>
        /// <param name="processInstanceId"></param>
        /// <returns></returns>
        public WfWorkflowInstanceData GetWorkflowInstance(int processInstanceId)
        {
            using (BizDataContext context = new BizDataContext())
            {
                var piCache = new ProcessInstanceCacheFactory(context);

                //实例信息
                SysProcessInstance pi      = piCache.GetProcessInstanceCache(processInstanceId);
                SysProcess         process = pi.Process;

                //定义信息
                WfWorkflowInstanceData data = new WfWorkflowInstanceData();
                data.Process = process.ConvertTo <WfProcess>();
                if (data.Process.TemplateId != null)
                {
                    data.Process.ProcessTemplate = Convert.ToBase64String(data.Process.TemplateId);
                    data.Process.TemplateId      = null;
                }
                data.ActivityList   = process.Activities.ConvertTo <WfActivity>();
                data.TransitionList = process.Transitions.ConvertTo <WfTransition>();

                data.ProcessInstance      = pi.ConvertTo <WfProcessInstance>();
                data.ActivityInstanceList = pi.ActivityInstances.ConvertTo <WfActivityInstance>();

                //加载活动实体信息
                foreach (var ai in data.ActivityInstanceList)
                {
                    LoadActivityEntityData(context, process, ai, data);
                }

                //连接线实例,这里表中少了个字段ProcessInstanceId,所以只能用这种方式来获取
                data.TransitionInstanceList = new List <WfTransitionInstance>();
                foreach (var ai in pi.ActivityInstances)
                {
                    var tempList = ai.FromTransitionInstances.ConvertTo <WfTransitionInstance>();
                    data.TransitionInstanceList = data.TransitionInstanceList.Union(tempList).ToList();
                }

                piCache.ClearCache(processInstanceId);

                return(data);
            }
        }
        /// <summary>
        /// 复制流程,从“已启用”或“已升级”的流程进入设计,需要先复制一份流程供设计
        /// 状态为“新增”,版本为当前最高版本 + 1
        /// </summary>
        public SysProcess CopyProcess()
        {
            SysProcess result;

            using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
            {
                using (BizDataContext db = new BizDataContext())
                {
                    //新流程
                    SysProcess newP = _process.ConvertTo <SysProcess>();
                    newP.ProcessId = db.GetNextIdentity();

                    //版本处理
                    newP.ProcessStatus = (int)ProcessState.Created;
                    string maxVersion = db.Set <SysProcess>().Where(p => p.ProcessType == _process.ProcessType).OrderByDescending(p => p.ProcessVersion).First().ProcessVersion;
                    newP.ProcessVersion = (maxVersion.ToInt() + 1).ToString();

                    result = newP;
                    db.Insert(newP);

                    //新流程参与人
                    var ppList = db.Set <SysProcessParticipant>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    Dictionary <long?, SysProcessParticipant> tempPpDict = new Dictionary <long?, SysProcessParticipant>();
                    foreach (var pp in ppList)
                    {
                        SysProcessParticipant newPp = pp.ConvertTo <SysProcessParticipant>();
                        newPp.ParticipantId = db.GetNextIdentity();
                        newPp.ProcessId     = newP.ProcessId;

                        tempPpDict[pp.ParticipantId] = newPp; //记录原始ID和新对象的关系
                    }
                    foreach (var newPp in tempPpDict.Values)
                    {
                        if (newPp.Param_ParticipantId != null) //通过刚才记录的关系找到实际的值
                        {
                            newPp.Param_ParticipantId = tempPpDict[newPp.Param_ParticipantId].ParticipantId;
                        }
                        db.Insert(newPp);
                    }

                    //新活动
                    var aList = db.Set <SysActivity>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    Dictionary <long?, SysActivity> tempADict = new Dictionary <long?, SysActivity>();
                    foreach (var a in aList)
                    {
                        SysActivity newA = a.ConvertTo <SysActivity>();
                        newA.ActivityId = db.GetNextIdentity();
                        newA.ProcessId  = newP.ProcessId;

                        tempADict[a.ActivityId] = newA;//记录原始ID和新对象的关系
                        db.Insert(newA);

                        //新活动参与人
                        var apList = db.Set <SysActivityParticipant>().Where(p => p.ActivityId == a.ActivityId).ToList();
                        foreach (var ap in apList)
                        {
                            SysActivityParticipant newAp = ap.ConvertTo <SysActivityParticipant>();
                            newAp.ActivityParticipantId = db.GetNextIdentity();
                            newAp.ActivityId            = newA.ActivityId;
                            newAp.ParticipantId         = tempPpDict[newAp.ParticipantId].ParticipantId; //通过刚才记录的关系找到实际的值
                            db.Insert(newAp);
                        }
                    }

                    //连接线
                    var tList = db.Set <SysTransition>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    foreach (var t in tList)
                    {
                        SysTransition newT = t.ConvertTo <SysTransition>();
                        newT.TransitionId = db.GetNextIdentity();
                        newT.ProcessId    = newP.ProcessId;

                        //通过刚才记录的关系找到实际的值
                        newT.PreActivityId  = tempADict[newT.PreActivityId].ActivityId;
                        newT.PostActivityId = tempADict[newT.PostActivityId].ActivityId;

                        db.Insert(newT);
                    }

                    //表单活动权限
                    var fpList = db.Set <SysFormPrivilege>().Where(p => p.ProcessId == _process.ProcessId).ToList();
                    foreach (var fp in fpList)
                    {
                        SysFormPrivilege newFp = fp.ConvertTo <SysFormPrivilege>();
                        newFp.PrivilegeId = db.GetNextIdentity();
                        newFp.ProcessId   = newP.ProcessId;
                        newFp.ActivityId  = tempADict[newFp.ActivityId].ActivityId;//通过刚才记录的关系找到实际的值

                        db.Insert(newFp);
                    }
                }
                ts.Complete();
            }
            return(result);
        }
        /// <summary>
        /// 根据ID查询工作流
        /// </summary>
        /// <param name="processId"></param>
        /// <returns></returns>
        public WfWorkflowData GetWorkFlow(long processId)
        {
            using (BizDataContext context = new BizDataContext())
            {
                var            pCache  = new ProcessCacheFactory(context);
                WfWorkflowData data    = new WfWorkflowData();
                SysProcess     process = pCache.GetProcessCache(processId);
                if (process != null)
                {
                    //流程定义
                    data.Process = process.ConvertTo <WfProcess>();
                    if (data.Process.TemplateId != null)
                    {
                        data.Process.ProcessTemplate = Convert.ToBase64String(data.Process.TemplateId);
                        data.Process.TemplateId      = null;
                    }

                    //2013-9-11 zhumin 这里的版本号直接返回当前最高版本 + 1,否则从“已升级”的载入,会版本错误
                    //载入“新增”状态的流程,版本不变
                    //载入其它状态的流程,复制一份为“新增”,版本为当前最高+1
                    //发布流程,版本不变
                    //新增第一个流程,版本为1
                    if (data.Process.ProcessStatus != (int)ProcessState.Created)
                    {
                        string maxVersion = context.Set <SysProcess>().Where(p => p.ProcessType == process.ProcessType).OrderByDescending(p => p.ProcessVersion).First().ProcessVersion;
                        data.Process.ProcessVersion = (maxVersion.ToInt() + 1).ToString();
                    }


                    //流程提醒
                    data.ProcessRemindList = process.ProcessReminds.ConvertTo <WfProcessRemind>();
                    var prpList = new List <SysProcessRemindParticipant>();
                    foreach (var pr in process.ProcessReminds)
                    {
                        prpList = prpList.Union(pr.RemindParticipants).ToList();
                    }
                    data.ProcessRemindParticipantList = prpList.ConvertTo <WfProcessRemindParticipant>();

                    //活动
                    data.ActivityList = process.Activities.ConvertTo <WfActivity>();

                    //活动参与人和活动提醒
                    var arList  = new List <SysActivityRemind>();
                    var apList  = new List <SysActivityParticipant>();
                    var arpList = new List <SysActivityRemindParticipant>();
                    var aoList  = new List <SysActivityOperation>();
                    var aosList = new List <SysActivityStep>();
                    foreach (var a in process.Activities)
                    {
                        arList = arList.Union(a.ActivityReminds).ToList();
                        apList = apList.Union(a.ActivityParticipants).ToList();
                        aoList = aoList.Union(a.ActivityOperations).ToList();

                        foreach (var ar in a.ActivityReminds)
                        {
                            arpList = arpList.Union(ar.RemindParticipants).ToList();
                        }

                        foreach (var ao in a.ActivityOperations)
                        {
                            aosList = aosList.Union(ao.ActivitySteps).ToList();
                        }
                    }
                    data.ActivityRemindList            = arList.ConvertTo <WfActivityRemind>();
                    data.ActivityParticipantList       = apList.ConvertTo <WfActivityParticipant>();
                    data.ActivityRemindParticipantList = arpList.ConvertTo <WfActivityRemindParticipant>();

                    //活动操作
                    data.ActivityOperationList = aoList.ConvertTo <WfActivityOperation>();
                    data.ActivityStepList      = aosList.ConvertTo <WfActivityStep>();

                    //条件、参与人、连接线
                    data.ExpressionList  = process.Expressions.ConvertTo <WfExpression>();
                    data.ParticipantList = process.ProcessParticipants.ConvertTo <WfProcessParticipant>();
                    data.TransitionList  = process.Transitions.ConvertTo <WfTransition>();
                }

                pCache.ClearCache(processId);

                return(data);
            }
        }