public static Participant Map(Domain.Participant p) { return(new Participant { Id = p.Id, FirstName = p.FirstName, LastName = p.LastName, MiddleName = p.MiddleName }); }
/// <summary> /// 获取一个流程实例 /// </summary> /// <param name="processInstID">流程实例ID</param> /// <returns></returns> private ProcessInst GetToRunProcessInst(string processInstID, IUser user) { ProcessInst processInst = Persistence.GetProcessInst(processInstID); ProcessDefine processDefine = GetProcessDefine(processInst.ProcessDefID); string processDefID = processInst.ProcessDefID; //如果流程还未启动,产生一个活动实例 if (processInst.CurrentState == (short)ProcessInstStatus.NoStart) { Activity srcActivity = processDefine.StartActivity; ActivityInst srcActInst = Persistence.GetActivityInsts(processInstID, srcActivity.ID, ActivityInstStatus.Compeleted)[0]; IList<Activity> destActivities = Persistence.GetOutActivities(processDefID, srcActivity.ID); UnitOfWork.ExecuteWithTrans<ProcessInst>(() => { foreach (var destActivity in destActivities) { DateTime startTime = DateTime.Now.AddSeconds(-1); ActivityInst destActInst = new ActivityInst() { ActivityDefID = destActivity.ID, CurrentState = (short)ActivityInstStatus.NoStart, ID = IdGenerator.NewComb().ToString(), CreateTime = startTime, Description = destActivity.Description, EndTime = WFUtil.MaxDate, Name = destActivity.Name, ProcessInstID = processInstID, RollbackFlag = 0, StartTime = startTime, SubProcessInstID = string.Empty, Type = (short)destActivity.ActivityType.Cast<ActivityType>(ActivityType.ManualActivity) }; Domain.Transition transition = new Domain.Transition() { ID = IdGenerator.NewComb().ToString(), DestActID = destActivity.ID, DestActInstID = destActInst.ID, DestActInstName = destActInst.Name, DestActName = destActivity.Name, ProcessInstID = processInstID, ProcessInstName = processInst.Name, SrcActID = srcActivity.ID, SrcActInstID = srcActInst.ID, SrcActInstName = srcActInst.Name, SrcActName = srcActivity.Name, TransTime = startTime }; TransControl transControl = new TransControl() { ID = IdGenerator.NewComb().ToString(), DestActID = destActivity.ID, DestActName = destActivity.Name, ProcessInstID = processInst.ID, SrcActID = srcActivity.ID, SrcActName = srcActivity.Name, TransTime = startTime, TransWeight = 100 }; if (destActivity is ManualActivity) { ManualActivity ma = destActivity as ManualActivity; WorkItem wi = new WorkItem() { ID = IdGenerator.NewComb().ToString(), ActionMask = string.Empty, ActionURL = ma.CustomURL.SpecifyURL, ActivityInstID = destActInst.ID, ActivityInstName = destActInst.Name, AllowAgent = (short)(ma.AllowAgent ? 1 : 0), BizState = (short)WorkItemBizStatus.Common, CreateTime = startTime, Creator = user.ID, CreatorName = user.Name, CurrentState = (short)WorkItemStatus.WaitExecute, Description = destActInst.Description, EndTime = WFUtil.MaxDate, Executor = string.Empty, ExecutorName = string.Empty, IsTimeOut = 0, Name = destActInst.Name, Participant = string.Empty, ProcessID = processDefID, ProcessInstID = processInst.ID, ProcessInstName = processInst.Name, ProcessName = processDefine.Name, RemindTime = WFUtil.MaxDate, RootProcessInstID = string.Empty, StartTime = startTime, TimeOutTime = WFUtil.MaxDate, Type = destActInst.Type }; //foreach (var participantor in ma.Participant.Participantors) //{ // Domain.Participant participant = new Domain.Participant() // { // ID = IdGenerator.NewComb().ToString(), // CreateTime = createTime, // DelegateType = (short)DelegateType.Sponsor, // Name = participantor.Name, // ParticipantID = participantor.ID, // ParticipantIndex = participantor.SortOrder, // ParticipantType = (short)participantor.ParticipantorType.Cast<ParticipantorType>(ParticipantorType.Person), // PartiInType = (short)PartiInType.Exe, // WorkItemID = wi.ID, // WorkItemState = (short)wi.CurrentState // }; // repository.SaveOrUpdate(participant); //} Domain.Participant participant = new Domain.Participant() { ID = IdGenerator.NewComb().ToString(), CreateTime = startTime, DelegateType = (short)DelegateType.Sponsor, Name = user.Name, ParticipantID = user.ID, ParticipantIndex = 1, ParticipantType = (short)ParticipantorType.Person, PartiInType = (short)PartiInType.Exe, WorkItemID = wi.ID, WorkItemState = (short)wi.CurrentState }; repository.SaveOrUpdate(participant); repository.SaveOrUpdate(wi); } srcActInst.CurrentState = (short)ActivityInstStatus.Compeleted; repository.SaveOrUpdate(srcActInst); repository.SaveOrUpdate(destActInst); repository.SaveOrUpdate(transition); repository.SaveOrUpdate(transControl); } }); } return processInst; }
/// <summary> /// 产生迁移活动 /// </summary> /// <param name="srcActInst"></param> public void RouteActivityInst(ActivityInst srcActInst) { Activity srcActivity = Context.ProcessDefine.Activities.FirstOrDefault(a => a.ID == srcActInst.ActivityDefID); IList<Activity> activateActivities = GetActivateActivities(Context.ProcessInst.ProcessDefID, srcActInst); string processInstID = Context.ProcessInst.ID; string processDefID = Context.ProcessInst.ProcessDefID; UnitOfWork.ExecuteWithTrans<WorkItem>(() => { foreach (var destActivity in activateActivities) { DateTime createTime = DateTime.Now; ActivityInst destActInst = new ActivityInst() { ActivityDefID = destActivity.ID, CurrentState = (short)(destActivity.ActivityType == ActivityType.EndActivity || destActivity.ActivityType == ActivityType.AutoActivity ? ActivityInstStatus.Compeleted : ActivityInstStatus.NoStart), ID = IdGenerator.NewComb().ToString(), CreateTime = createTime, Description = destActivity.Description, EndTime = WFUtil.MaxDate, Name = destActivity.Name, ProcessInstID = processInstID, RollbackFlag = 0, StartTime = createTime, SubProcessInstID = string.Empty, Type = (short)destActivity.ActivityType.Cast<ActivityType>(ActivityType.ManualActivity) }; Domain.Transition transition = new Domain.Transition() { ID = IdGenerator.NewComb().ToString(), DestActID = destActivity.ID, DestActInstID = destActInst.ID, DestActInstName = destActInst.Name, DestActName = destActivity.Name, ProcessInstID = processInstID, ProcessInstName = Context.ProcessInst.Name, SrcActID = srcActivity.ID, SrcActInstID = srcActInst.ID, SrcActInstName = srcActInst.Name, SrcActName = srcActivity.Name, TransTime = createTime }; TransControl transControl = new TransControl() { ID = IdGenerator.NewComb().ToString(), DestActID = destActivity.ID, DestActName = destActivity.Name, ProcessInstID = processInstID, SrcActID = srcActivity.ID, SrcActName = srcActivity.Name, TransTime = createTime, TransWeight = 100 }; //srcActInst.CurrentState = (short)ActivityInstStatus.Compeleted; if (destActivity is ManualActivity) { #region ManualActivityHandler ManualActivity ma = destActivity as ManualActivity; WorkItem wi = new WorkItem() { ID = IdGenerator.NewComb().ToString(), ActionMask = string.Empty, ActionURL = ma.CustomURL.SpecifyURL, ActivityInstID = destActInst.ID, ActivityInstName = destActInst.Name, AllowAgent = (short)(ma.AllowAgent ? 1 : 0), BizState = (short)WorkItemBizStatus.Common, CreateTime = createTime, Creator = WFUtil.User.ID, CreatorName = WFUtil.User.Name, CurrentState = (short)WorkItemStatus.WaitExecute, Description = destActInst.Description, EndTime = WFUtil.MaxDate, Executor = string.Empty, ExecutorName = string.Empty, IsTimeOut = 0, Name = destActInst.Name, Participant = Persistence.GetParticipant(processDefID, destActivity.ID), ProcessID = processDefID, ProcessInstID = processInstID, ProcessInstName = Context.ProcessInst.Name, ProcessName = Context.ProcessDefine.Name, RemindTime = WFUtil.MaxDate, RootProcessInstID = string.Empty, StartTime = createTime, TimeOutTime = WFUtil.MaxDate, Type = destActInst.Type, //ExecuteTime = null, }; IList<Participantor> participantors = assignParticipant == null ? ma.Participant.Participantors : new List<Participantor> { assignParticipant() }; foreach (var participantor in participantors) { Domain.Participant participant = new Domain.Participant() { ID = IdGenerator.NewComb().ToString(), CreateTime = createTime, DelegateType = (short)DelegateType.Sponsor, Name = participantor.Name, ParticipantID = participantor.ID, ParticipantIndex = participantor.SortOrder, ParticipantType = (short)participantor.ParticipantorType.Cast<ParticipantorType>(ParticipantorType.Person), PartiInType = (short)PartiInType.Exe, WorkItemID = wi.ID, WorkItemState = (short)wi.CurrentState }; Persistence.Repository.SaveOrUpdate(participant); } Persistence.Repository.SaveOrUpdate(wi); #endregion } else if (destActivity is AutoActivity) { if (!HandlerAutoActivity(processDefID, srcActivity, destActivity, destActInst)) destActInst.CurrentState = (short)ActivityInstStatus.Suspended; } srcActInst.CurrentState = (short)ActivityInstStatus.Compeleted; Persistence.Repository.SaveOrUpdate(srcActInst); Persistence.Repository.SaveOrUpdate(destActInst); Persistence.Repository.SaveOrUpdate(transition); Persistence.Repository.SaveOrUpdate(transControl); } }); }