/// <summary> /// 申请工作流内部表单 /// </summary> /// <param name="flowId">流程id</param> /// <param name="applyerId">申请人id</param> /// <returns>流程实例id,开始关卡实例id,流程号</returns> public void ApplyInnerFlow(int flowId, ref int flowNo, int applyerId, string formDigest, out Dictionary <string, string> param) { using (TransactionScope scope = new TransactionScope()) { param = new Dictionary <string, string>(); if (flowNo == 0) { flowNo = CreateFlowNo(flowId); } //创建流程实例 FlowInstance flowInst = new FlowInstance(); ActivityInstance activityInst = new ActivityInstance(); if (FlowInstance.Exists(flowId, flowNo)) { flowInst = new FlowInstance(flowId, flowNo); flowInst.UpdateDigest(formDigest); Activity startActvity = flowInst.FlowDefine.GetStartActivity(); activityInst = flowInst.FindActivityInstance(ActivityType.START); WorkItemInstance item = new WorkItemInstance(); item.CreateResend(activityInst.ID, flowInst.ApplerID, ""); } else { flowInst.Create(flowId, flowNo, applyerId, formDigest); activityInst.Create(flowInst.ID, flowInst.FlowDefine.GetStartActivity().ID); activityInst.Active(); } //返回流程实例id,开始关卡实例id,流程号 param.Add("FlowInstId", flowInst.ID.ToString()); param.Add("ActivityInstId", activityInst.ID.ToString()); param.Add("SplitType", flowInst.FlowDefine.GetStartActivity().SplitType); scope.Complete(); } }
/// <summary> /// 转交一下步 /// </summary> /// <param name="flowInstId">流程实例id</param> /// <param name="listToActivityId">下一步关卡list</param> /// <returns>是否成功</returns> public bool TransferBack(int activityInstId, List <int> listToActivityId) { using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = IsolationLevel.ReadCommitted })) { try { //初始化变量 ActivityInstance instActivity = new ActivityInstance(activityInstId); FlowInstance instFlow = instActivity.FlowInstance; instActivity.Close(); //实例化后面的关卡 foreach (int activityId in listToActivityId) { //检查关卡是否被实例化过 ActivityInstance instToActivity = instFlow.FindActivityInstance(activityId); if (instToActivity == null || instToActivity.State == ActivityInstanceStatus.Completed) { instToActivity = new ActivityInstance(); instToActivity.Create(instFlow.ID, activityId); } //检查前置关卡完成情况 if (instToActivity.CheckFrontActivityState()) { //如果是结束关卡,关闭关卡实例 if (instToActivity.Activity.Type == ActivityType.END) { instFlow.ApprovePass += new FlowInstance.ApproveEventHandler(Mail.SendMail); instFlow.ApprovePass += new FlowInstance.ApproveEventHandler(CallBack.Update); instToActivity.Close(); instFlow.Pass(); } //如果不是结束关卡,激活关卡并分配工作 else { instToActivity.Active(); instToActivity.AssignWork(); } //关闭与前置关卡平行的关卡 List <ActivityInstance> listParallelActivity = instFlow.ActivityInstances.Where( t => t.State == ActivityInstanceStatus.Active && t.Activity.ID != instToActivity.Activity.ID).ToList(); foreach (ActivityInstance p in listParallelActivity) { p.Close(); } } else { instToActivity.Pending(); //前置关卡未完成,搁置状态 } } if (instActivity.Activity.Type == ActivityType.START) { instFlow.Active(); //调用表单申请Action FlowAction <IApply> flowAction = new FlowAction <IApply>(instFlow.FlowDefine.IsInner, instFlow.FlowDefine.ID); if (flowAction.action != null) { if (!flowAction.action.ApplyAction(instFlow.FlowDefine.ID, instFlow.FlowNo, instFlow.ApplerID)) { throw new Exception(string.Format("ApplyAction失败,flowId:{0},flowNo:{1},ApplerID:{2}", instFlow.FlowDefine.ID, instFlow.FlowNo, instFlow.ApplerID)); } } //知会 List <F_FLOW_CONFIG> listConfig = DAL.WorkFlow.Flow.GetFlowConfig(instFlow.FlowDefine.ID, "Notice"); List <int> listWorkerId = new List <int>(); foreach (F_FLOW_CONFIG config in listConfig) { listWorkerId.Add(int.Parse(config.ItemValue)); } new Flow().Notify(instFlow.FlowDefine.ID, instFlow.FlowNo, listWorkerId); } scope.Complete(); return(true); } catch (Exception ex) { Log4Net.LogError("Workflow_Engine", string.Format("ActivityInstId:{0},Message:{1}", activityInstId, ex.ToString())); return(false); } } }