/// <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); } }