public void Save_Click(object sender, AjaxEventArgs e) { string workItemId = HWorkItemId.Value.ToString(); IWorkflowSession wflsession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); IWorkItem wi = wflsession.findWorkItemById(workItemId); String sn = (String)wi.TaskInstance.AliveProcessInstance.getProcessInstanceVariable("sn"); LoanInfoDAO lid = new LoanInfoDAO(); LoanInfo loanInfo = lid.findBySn(sn); loanInfo.RejectInfoInputTime = DateTime.Parse(rejectInfoInputTime.Text);//lendMoneyInfo loanInfo.RejectInfo = comments.Text; //4、完成工单 try { if (wi != null) { if (wi.ActorId == this.User.Identity.Name) { wi.complete(comments.Text); } } } catch { throw; } }
public bool claim(String workItemId) { IWorkflowSession wflsession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); IWorkItem wi = wflsession.findWorkItemById(workItemId); try { if (wi != null) { if (wi.ActorId == this.User.Identity.Name) { wi.claim(); Sdate_Refresh(null, null); return(true); } else { return(false); } } } catch { throw; } return(false); }
protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { if (this.Request.QueryString["WorkItemId"] != null) { string workItemId = this.Request.QueryString["WorkItemId"]; IWorkflowSession wflsession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); IWorkItem wi = wflsession.findWorkItemById(workItemId); String sn = (String)wi.TaskInstance.AliveProcessInstance.getProcessInstanceVariable("sn"); TradeInfo ti = tradeInfoDao.findById(sn); if (ti != null) { HWorkItemId.Value = workItemId; Sn.Text = ti.Sn; GoodsName.Text = ti.GoodsName; UnitPrice.Text = ti.UnitPrice.ToString(); Quantity.Text = ti.Quantity.ToString(); Amount.Text = ti.Amount.ToString(); CustomerName.Text = ti.CustomerName; CustomerMobile.Text = ti.CustomerMobile; CustomerPhoneFax.Text = ti.CustomerPhoneFax; } } } }
public void complete(String workItemId) { IWorkflowSession wflsession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); IWorkItem wi = wflsession.findWorkItemById(workItemId); try { if (wi != null) { if (wi.ActorId == this.User.Identity.Name) { if (wi.TaskInstance.Task is FormTask) { String formUri = this.ResolveUrl(((FormTask)wi.TaskInstance.Task).EditForm.Uri + "?WorkItemId=" + workItemId); WindowView.AutoLoad.Url = formUri; WindowView.AutoLoad.Mode = LoadMode.IFrame; WindowView.AutoLoad.NoCache = true; WindowView.LoadContent(); //WindowView.Reload(); //WindowView.AutoLoad.SaveViewState(); WindowView.Show(); } } } } catch { throw; } }
public ITaskInstance createTaskInstance(IWorkflowSession currentSession, RuntimeContext runtimeContxt, IProcessInstance processInstance, Task task, Activity activity)// throws EngineException { TaskInstance taskInstance = new TaskInstance(); return(taskInstance); }
public ITaskInstance createTaskInstance(IWorkflowSession currentSession, RuntimeContext runtimeContxt, IProcessInstance processInstance, Task task, Activity activity) { GoodsDeliverTaskInstance taskInst = new GoodsDeliverTaskInstance(); String sn = (String)processInstance.getProcessInstanceVariable("sn"); taskInst.Sn = sn; String customerName = (String)processInstance.getProcessInstanceVariable("customerName"); taskInst.CustomerName = customerName; String goodsName = (String)processInstance.getProcessInstanceVariable("goodsName"); taskInst.GoodsName = goodsName; long quantity = (long)processInstance.getProcessInstanceVariable("quantity"); taskInst.Quantity = quantity; //taskInst.BizInfo= return(taskInst); }
/// <summary> /// 响应任务实例的事件。通过e.getEventType区分事件的类型。 /// </summary> /// <param name="e">任务实例的事件。</param> public void onTaskInstanceEventFired(TaskInstanceEvent e)// throws EngineException { IWorkflowSession session = e.WorkflowSession; IProcessInstance proceInst = e.ProcessInstance; ITaskInstance taskInst = (ITaskInstance)e.Source; IWorkItem wi = e.WorkItem; switch (e.EventType) { case TaskInstanceEventEnum.BEFORE_TASK_INSTANCE_START: beforeTaskInstanceStart(session, proceInst, taskInst); break; case TaskInstanceEventEnum.AFTER_WORKITEM_CREATED: afterWorkItemCreated(session, proceInst, taskInst, wi); break; case TaskInstanceEventEnum.AFTER_WORKITEM_COMPLETE: afterWorkItemComplete(session, proceInst, taskInst, wi); break; case TaskInstanceEventEnum.AFTER_TASK_INSTANCE_COMPLETE: afterTaskInstanceCompleted(session, proceInst, taskInst); break; default: break; } }
protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { if (this.Request.QueryString["WorkItemId"] != null) { string workItemId = this.Request.QueryString["WorkItemId"]; IWorkflowSession wflsession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); IWorkItem wi = wflsession.findWorkItemById(workItemId); String sn = (String)wi.TaskInstance.AliveProcessInstance.getProcessInstanceVariable("sn"); LoanInfoDAO lid = new LoanInfoDAO(); LoanInfo ti = lid.findBySn(sn); if (ti != null) { HWorkItemId.Value = workItemId; applicantName.Text = ti.ApplicantName; applicantId.Text = ti.ApplicantId; address.Text = ti.Address; salary.Text = ti.Salary.ToString(); loanValue.Text = ti.LoanValue.ToString(); returnDate.Text = ti.ReturnDate; loanteller.Text = ti.Loanteller; appInfoInputDate.Text = ti.AppInfoInputDate.ToString("yyyy-MM-dd hh:mm:ss"); salaryIsReal.Text = ti.SalaryIsReal ? "属实" : "不属实"; creditStatus.Text = ti.CreditStatus ? "合格" : "不合格"; riskEvaluator.Text = ti.RiskEvaluator; riskInfoInputDate.Text = ti.RiskInfoInputDate.ToString("yyyy-MM-dd hh:mm:ss"); rejectInfoInputTime.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); } } } }
public ITaskInstance createTaskInstance(IWorkflowSession currentSession, RuntimeContext runtimeContxt, IProcessInstance processInstance, Task task, Activity activity) { LoanTaskInstance taskInstance = new LoanTaskInstance(); taskInstance.Sn=(String)processInstance.getProcessInstanceVariable("sn"); taskInstance.ApplicantName=(String)processInstance.getProcessInstanceVariable("applicantName"); taskInstance.LoanValue=(int)processInstance.getProcessInstanceVariable("loanValue"); taskInstance.RiskFlag=(Boolean)processInstance.getProcessInstanceVariable("RiskFlag"); taskInstance.Decision=(Boolean)processInstance.getProcessInstanceVariable("Decision"); return taskInstance; }
public void Save_Click(object sender, AjaxEventArgs e) { string workItemId = HWorkItemId.Value.ToString(); IWorkflowSession wflsession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); IWorkItem wi = wflsession.findWorkItemById(workItemId); String sn = (String)wi.TaskInstance.AliveProcessInstance.getProcessInstanceVariable("sn"); LoanInfoDAO lid = new LoanInfoDAO(); LoanInfo loanInfo = lid.findBySn(sn); loanInfo.SalaryIsReal = Boolean.Parse(salaryIsReal.SelectedItem.Value); loanInfo.CreditStatus = Boolean.Parse(creditStatus.SelectedItem.Value); loanInfo.RiskEvaluator = riskEvaluator.Text; loanInfo.RiskInfoInputDate = DateTime.Parse(riskInfoInputDate.Text); //1、首先通过"收入状况是否属实"和"信用状况是否合格"这两项指标来设置RiskFlag流程变量 if (loanInfo.SalaryIsReal && loanInfo.CreditStatus) { loanInfo.RiskFlag = false;//false表示风险评估通过 } else { loanInfo.RiskFlag = true;//表示有风险 } //2、将RiskFlag设置到流程变量 try { wi.TaskInstance.AliveProcessInstance.setProcessInstanceVariable("RiskFlag", loanInfo.RiskFlag); } catch { throw; } //3、保存业务数据 lid.attachDirty(loanInfo); try { if (wi != null) { if (wi.ActorId == this.User.Identity.Name) { wi.complete(comments.Text); } } } catch { throw; } }
//throws EngineException ,KernelException public Boolean taskInstanceCanBeCompleted(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) { IPersistenceService persistenceService = runtimeContext.PersistenceService; Int32 aliveWorkItemCount = persistenceService.GetAliveWorkItemCountForTaskInstance(taskInstance.Id); if (aliveWorkItemCount == 0) { return true; } else { return false; } }
public Boolean taskInstanceCanBeCompleted(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance)//throws EngineException ,KernelException { IPersistenceService persistenceService = runtimeContext.PersistenceService; Int32 aliveWorkItemCount = persistenceService.GetAliveWorkItemCountForTaskInstance(taskInstance.Id); if (aliveWorkItemCount == 0) { return(true); } else { return(false); } }
/// <summary> /// 判断任务实例是否可以终止 /// </summary> /// <param name="currentSession"></param> /// <param name="runtimeContext"></param> /// <param name="processInstance"></param> /// <param name="taskInstance"></param> /// <returns>true表示可以终止,false不能终止</returns> public Boolean taskInstanceCanBeCompleted(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance)//throws EngineException ,KernelException { //在Fire Workflow 中,系统默认每个子流程仅创建一个实例,所以当子流程实例完成后,SubflowTaskInstance都可以被completed //所以,应该直接返回true; return(true); //如果系统动态创建了多个并发子流程实例,则需要检查是否存在活动的子流程实例,如果存在则返回false,否则返回true。 //可以用下面的代码实现 // IPersistenceService persistenceService = runtimeContext.PersistenceService; // Int32 count = persistenceService.getAliveProcessInstanceCountForParentTaskInstance(taskInstance.Id); // if (count>0){ // return false; // }else{ // return true; // } }
//throws EngineException ,KernelException /// <summary> /// 判断任务实例是否可以终止 /// </summary> /// <param name="currentSession"></param> /// <param name="runtimeContext"></param> /// <param name="processInstance"></param> /// <param name="taskInstance"></param> /// <returns>true表示可以终止,false不能终止</returns> public Boolean taskInstanceCanBeCompleted(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) { //在Fire Workflow 中,系统默认每个子流程仅创建一个实例,所以当子流程实例完成后,SubflowTaskInstance都可以被completed //所以,应该直接返回true; return true; //如果系统动态创建了多个并发子流程实例,则需要检查是否存在活动的子流程实例,如果存在则返回false,否则返回true。 //可以用下面的代码实现 // IPersistenceService persistenceService = runtimeContext.PersistenceService; // Int32 count = persistenceService.getAliveProcessInstanceCountForParentTaskInstance(taskInstance.Id); // if (count>0){ // return false; // }else{ // return true; // } }
public void run(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance)// throws EngineException, KernelException { if (taskInstance.TaskType != TaskTypeEnum.TOOL) { throw new EngineException(processInstance, taskInstance.Activity, "DefaultToolTaskInstanceRunner:TaskInstance的任务类型错误,只能为TOOL类型"); } Task task = taskInstance.Task; if (task == null) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "The Task is null,can NOT start the taskinstance,"); } if (((ToolTask)task).Application == null || ((ToolTask)task).Application.Handler == null) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "The task.Application is null or task.Application.Handler is null,can NOT start the taskinstance,"); } Object obj = runtimeContext.getBeanByName(((ToolTask)task).Application.Handler); if (obj == null || !(obj is IApplicationHandler)) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "Run tool task instance error! Not found the instance of " + ((ToolTask)task).Application.Handler + " or the instance not implements IApplicationHandler"); } try { ((IApplicationHandler)obj).execute(taskInstance); } catch (Exception) {//TODO wmj2003 对tool类型的task抛出的错误应该怎么处理? 这个时候引擎会如何?整个流程是否还可以继续? throw new EngineException(processInstance, taskInstance.Activity, "DefaultToolTaskInstanceRunner:TaskInstance的任务执行失败!"); } ITaskInstanceManager taskInstanceManager = runtimeContext.TaskInstanceManager; taskInstanceManager.completeTaskInstance(currentSession, processInstance, taskInstance, null); }
// throws EngineException, KernelException public void run(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) { if (taskInstance.TaskType != TaskTypeEnum.TOOL) { throw new EngineException(processInstance, taskInstance.Activity, "DefaultToolTaskInstanceRunner:TaskInstance的任务类型错误,只能为TOOL类型"); } Task task = taskInstance.Task; if (task == null) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "The Task is null,can NOT start the taskinstance,"); } if (((ToolTask)task).Application == null || ((ToolTask)task).Application.Handler == null) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "The task.Application is null or task.Application.Handler is null,can NOT start the taskinstance,"); } Object obj = runtimeContext.getBeanByName(((ToolTask)task).Application.Handler); if (obj == null || !(obj is IApplicationHandler)) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "Run tool task instance error! Not found the instance of " + ((ToolTask)task).Application.Handler + " or the instance not implements IApplicationHandler"); } try { ((IApplicationHandler)obj).execute(taskInstance); } catch (Exception ) {//TODO wmj2003 对tool类型的task抛出的错误应该怎么处理? 这个时候引擎会如何?整个流程是否还可以继续? throw new EngineException(processInstance, taskInstance.Activity, "DefaultToolTaskInstanceRunner:TaskInstance的任务执行失败!"); } ITaskInstanceManager taskInstanceManager = runtimeContext.TaskInstanceManager; taskInstanceManager.completeTaskInstance(currentSession, processInstance, taskInstance, null); }
// throws EngineException, KernelException public void run(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) { if (taskInstance.TaskType!= TaskTypeEnum.FORM)//!Task.FORM.Equals(taskInstance.TaskType)) { throw new EngineException(processInstance, taskInstance.Activity, "DefaultFormTaskInstanceRunner:TaskInstance的任务类型错误,只能为FORM类型"); } DynamicAssignmentHandler dynamicAssignmentHandler = ((WorkflowSession)currentSession).consumeCurrentDynamicAssignmentHandler(); FormTask task = (FormTask)taskInstance.Task; // performer(id,name,type,handler) Participant performer = task.Performer; if (performer == null || performer.AssignmentHandler.Trim().Equals("")) { throw new EngineException(processInstance, taskInstance.Activity, "流程定义错误,Form类型的 task必须指定performer及其AssignmentHandler"); } assign(currentSession, processInstance, runtimeContext, taskInstance, task, performer, dynamicAssignmentHandler); }
public void run(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) // throws EngineException, KernelException { if (taskInstance.TaskType != TaskTypeEnum.FORM) //!Task.FORM.Equals(taskInstance.TaskType)) { throw new EngineException(processInstance, taskInstance.Activity, "DefaultFormTaskInstanceRunner:TaskInstance的任务类型错误,只能为FORM类型"); } DynamicAssignmentHandler dynamicAssignmentHandler = ((WorkflowSession)currentSession).consumeCurrentDynamicAssignmentHandler(); FormTask task = (FormTask)taskInstance.Task; // performer(id,name,type,handler) Participant performer = task.Performer; if (performer == null || performer.AssignmentHandler.Trim().Equals("")) { throw new EngineException(processInstance, taskInstance.Activity, "流程定义错误,Form类型的 task必须指定performer及其AssignmentHandler"); } assign(currentSession, processInstance, runtimeContext, taskInstance, task, performer, dynamicAssignmentHandler); }
public void Save_Click(object sender, AjaxEventArgs e) { string workItemId = HWorkItemId.Value.ToString(); IWorkflowSession wflsession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); IWorkItem wi = wflsession.findWorkItemById(workItemId); try { if (wi != null) { if (wi.ActorId == this.User.Identity.Name) { wi.complete(comments.Text); } } } catch { throw; } }
public void Save_Click(object sender, AjaxEventArgs e) { // 一、执行业务业务操作,保存业务数据 paymentInfo = new TradeInfo() { Sn = Sn.Text, GoodsName = GoodsName.SelectedItem.Value, UnitPrice = UnitPrice.Number, Quantity = (long)Quantity.Number, Amount = Amount.Number, CustomerName = CustomerName.Text, CustomerMobile = CustomerMobile.Text, CustomerPhoneFax = CustomerPhoneFax.Text }; tradeInfoDao.save(paymentInfo); // 二、开始执行流程操作 IWorkflowSession workflowSession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession();//.workflowRuntimeContext.getWorkflowSession(); try { // 1、创建流程实例 IProcessInstance procInst = workflowSession.createProcessInstance("Goods_Deliver_Process", this.User.Identity.Name); // 2、设置流程变量/业务属性字段 procInst.setProcessInstanceVariable("sn", paymentInfo.Sn); // 设置交易顺序号 procInst.setProcessInstanceVariable("goodsName", paymentInfo.GoodsName); // 货物名称 procInst.setProcessInstanceVariable("quantity", paymentInfo.Quantity); // 数量 procInst.setProcessInstanceVariable("mobile", paymentInfo.CustomerMobile); // 客户电话 procInst.setProcessInstanceVariable("customerName", paymentInfo.CustomerName); // 3、启动流程实例,run()方法启动实例并创建第一个环节实例、分派任务 procInst.run(); } catch { throw; } paymentInfo = new TradeInfo(); }
public ITaskInstance createTaskInstance(IWorkflowSession currentSession, RuntimeContext runtimeContxt, IProcessInstance processInstance, Task task, Activity activity) { GoodsDeliverTaskInstance taskInst = new GoodsDeliverTaskInstance(); String sn = (String)processInstance.getProcessInstanceVariable("sn"); taskInst.Sn = sn; String customerName = (String)processInstance.getProcessInstanceVariable("customerName"); taskInst.CustomerName = customerName; String goodsName = (String)processInstance.getProcessInstanceVariable("goodsName"); taskInst.GoodsName = goodsName; long quantity = (long)processInstance.getProcessInstanceVariable("quantity"); taskInst.Quantity = quantity; //taskInst.BizInfo= return taskInst; }
public void Save_Click(object sender, AjaxEventArgs e) { LoanInfoDAO loanInfoDAO = new LoanInfoDAO(); LoanInfo loanInfo = new LoanInfo() { ApplicantName = applicantName.Text, ApplicantId = applicantId.Text, Address = address.Text, Salary = int.Parse(salary.Text), LoanValue = int.Parse(loanValue.Text), ReturnDate = returnDate.SelectedDate.ToString("yyyy-MM-dd"), Loanteller = loanteller.Text, AppInfoInputDate = DateTime.Parse(appInfoInputDate.Text) }; // 一、执行业务业务操作,保存业务数据 loanInfoDAO.attachDirty(loanInfo); // 二、开始执行流程操作 IWorkflowSession workflowSession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); try { // 1、创建流程实例 IProcessInstance procInst = workflowSession.createProcessInstance("LoanProcess", this.User.Identity.Name); // 2、设置流程变量/业务属性字段 procInst.setProcessInstanceVariable("sn", loanInfo.Sn); // 设置流水号 procInst.setProcessInstanceVariable("applicantName", loanInfo.ApplicantName); //贷款人姓名 procInst.setProcessInstanceVariable("loanValue", loanInfo.LoanValue); // 贷款数额 // 3、启动流程实例,run()方法启动实例并创建第一个环节实例、分派任务 procInst.run(); } catch { throw; } }
public void Save_Click(object sender, AjaxEventArgs e) { string workItemId = HWorkItemId.Value.ToString(); IWorkflowSession wflsession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); IWorkItem wi = wflsession.findWorkItemById(workItemId); String sn = (String)wi.TaskInstance.AliveProcessInstance.getProcessInstanceVariable("sn"); ApproveInfoDAO aid = new ApproveInfoDAO(); WebDemo.Example.LoanProcess.Persistence.ApproveInfo approveInfo = aid.findBySnAndUserId(sn, this.User.Identity.Name); if (approveInfo == null) { approveInfo = new WebDemo.Example.LoanProcess.Persistence.ApproveInfo(); approveInfo.Sn = sn; approveInfo.Approver = this.User.Identity.Name; } approveInfo.Detail = comments.Text; approveInfo.Decision = my_decision.SelectedItem.Value == "True"; //3、保存业务数据 aid.attachDirty(approveInfo); //4、完成工单 try { if (wi != null) { if (wi.ActorId == this.User.Identity.Name) { wi.complete(comments.Text); } } } catch { throw; } }
protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { if (this.Request.QueryString["WorkItemId"] != null) { string workItemId = this.Request.QueryString["WorkItemId"]; IWorkflowSession wflsession = RuntimeContextExamples.GetRuntimeContext().getWorkflowSession(); IWorkItem wi = wflsession.findWorkItemById(workItemId); String sn = (String)wi.TaskInstance.AliveProcessInstance.getProcessInstanceVariable("sn"); LoanInfoDAO lid = new LoanInfoDAO(); LoanInfo ti = lid.findBySn(sn); if (ti != null) { HWorkItemId.Value = workItemId; applicantName.Text = ti.ApplicantName; applicantId.Text = ti.ApplicantId; address.Text = ti.Address; salary.Text = ti.Salary.ToString(); loanValue.Text = ti.LoanValue.ToString(); returnDate.Text = ti.ReturnDate; loanteller.Text = ti.Loanteller; salaryIsReal.Text = ti.SalaryIsReal ? "属实" : "不属实"; creditStatus.Text = ti.CreditStatus ? "合格" : "不合格"; riskEvaluator.Text = ti.RiskEvaluator; riskInfoInputDate.Text = ti.RiskInfoInputDate.ToString("yyyy-MM-dd hh:mm:ss"); } ApproveInfoDAO aid = new ApproveInfoDAO(); WebDemo.Example.LoanProcess.Persistence.ApproveInfo approveInfo = aid.findBySnAndUserId(sn, this.User.Identity.Name); if (approveInfo != null) { comments.Text = approveInfo.Detail; my_decision.SelectedItem.Value = approveInfo.Decision.ToString(); } } } }
/// <summary> /// 判断任务实例是否可以终止 /// </summary> /// <param name="currentSession"></param> /// <param name="runtimeContext"></param> /// <param name="processInstance"></param> /// <param name="taskInstance"></param> /// <returns>true表示可以终止,false不能终止</returns> public Boolean taskInstanceCanBeCompleted(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance)//throws EngineException ,KernelException { //Tool类型的TaskInstance在handler执行完后,都可以直接结束。 return(true); }
public bool taskInstanceCanBeCompleted(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) { IPersistenceService persistenceService = runtimeContext.PersistenceService; List <IWorkItem> workItems = persistenceService.FindWorkItemsForTaskInstance(taskInstance.Id); //从流程变量中获取业务流水号 String sn = (String)processInstance.getProcessInstanceVariable("sn"); //已经完成的WorkItem数量 int completedWorkItemCount = 0; //审批同意的决定的数量 int approvedDecitionCount = 0; StringBuilder examinerList = new StringBuilder(); //所有审核人名单 StringBuilder approverList = new StringBuilder(); //同意者名单 StringBuilder opponentList = new StringBuilder(); //不同意者名单 for (int i = 0; i < workItems.Count; i++) { IWorkItem wi = workItems[i]; if (wi.State == WorkItemEnum.COMPLETED) { completedWorkItemCount++; WebDemo.Example.LoanProcess.Persistence.ApproveInfo approveInfo = approveInfoDAO.findBySnAndUserId(sn, wi.ActorId); if (approveInfo != null) { examinerList.Append(approveInfo.Approver).Append(","); if (approveInfo.Decision) { approvedDecitionCount++; approverList.Append(approveInfo.Approver).Append(","); } else { opponentList.Append(approveInfo.Approver).Append(","); } } } } //------------------判断是否可以结束该汇签任务----------- float size = (float)workItems.Count; float theRule = 2 / 3f; float currentCompletedPercentage = completedWorkItemCount / size; //已经完成的工单占总工单的比例 float currentAggreePercentage = approvedDecitionCount / size; //已经同意的比例 //如果完成的工单数量小于2/3,则直接返回false,即不可以结束TaskInstance if (currentCompletedPercentage < theRule) { return(false); } //如果同意的数量达到2/3则直接结束TaskInstance else if (currentAggreePercentage >= theRule) { //修改流程变量的值 processInstance.setProcessInstanceVariable("Decision", true); //将最终审批决定纪录到业务表中 LoanInfo loanInfo = loanInfoDAO.findBySn(sn); if (loanInfo != null) { loanInfo.Decision = true; loanInfo.ExaminerList = examinerList.ToString(); loanInfo.ApproverList = approverList.ToString(); loanInfo.OpponentList = opponentList.ToString(); loanInfoDAO.attachDirty(loanInfo); } return(true); } //当所有的workItem结束时,可以结束TaskInstance else if (completedWorkItemCount == workItems.Count) { LoanInfo loanInfo = loanInfoDAO.findBySn(sn); if (currentAggreePercentage < theRule) { //修改流程变量的值 processInstance.setProcessInstanceVariable("Decision", false); //将最终审批决定记录到业务表中 if (loanInfo != null) { loanInfo.Decision = false; } loanInfo.ExaminerList = examinerList.ToString(); loanInfo.ApproverList = approverList.ToString(); loanInfo.OpponentList = opponentList.ToString(); loanInfoDAO.attachDirty(loanInfo); } else { //修改流程变量的值 processInstance.setProcessInstanceVariable("Decision", true); //将最终审批决定记录到业务表中 if (loanInfo != null) { loanInfo.Decision = true; } loanInfo.ExaminerList = examinerList.ToString(); loanInfo.ApproverList = approverList.ToString(); loanInfo.OpponentList = opponentList.ToString(); loanInfoDAO.attachDirty(loanInfo); } return(true); } return(false); }
/// <summary>分配, 按照当前任务的参与者插入工单</summary> /// <param name="currentSession"></param> /// <param name="processInstance"></param> /// <param name="runtimeContext"></param> /// <param name="taskInstance"></param> /// <param name="formTask"></param> /// <param name="part"></param> /// <param name="dynamicAssignmentHandler"></param> protected void assign(IWorkflowSession currentSession, IProcessInstance processInstance, RuntimeContext runtimeContext, ITaskInstance taskInstance, FormTask formTask, Participant part, DynamicAssignmentHandler dynamicAssignmentHandler)// throws EngineException, KernelException { //如果有指定的Actor,则按照指定的Actor分配任务 if (dynamicAssignmentHandler != null) { dynamicAssignmentHandler.assign((IAssignable)taskInstance, part.Name); } else { IPersistenceService persistenceService = runtimeContext.PersistenceService; List <ITaskInstance> taskInstanceList = persistenceService.FindTaskInstancesForProcessInstance(taskInstance.ProcessInstanceId, taskInstance.ActivityId); ITaskInstance theLastCompletedTaskInstance = null; for (int i = 0; taskInstanceList != null && i < taskInstanceList.Count; i++) { ITaskInstance tmp = (ITaskInstance)taskInstanceList[i]; if (tmp.Id.Equals(taskInstance.Id)) { continue; } if (!tmp.TaskId.Equals(taskInstance.TaskId)) { continue; } if (tmp.State != TaskInstanceStateEnum.COMPLETED) { continue; } if (theLastCompletedTaskInstance == null) { theLastCompletedTaskInstance = tmp; } else { if (theLastCompletedTaskInstance.StepNumber < tmp.StepNumber) { theLastCompletedTaskInstance = tmp; } } } //如果是循环且LoopStrategy==REDO,则分配个上次完成该工作的操作员 if (theLastCompletedTaskInstance != null && (LoopStrategyEnum.REDO == formTask.LoopStrategy || currentSession.isInWithdrawOrRejectOperation())) { List <IWorkItem> workItemList = persistenceService.FindCompletedWorkItemsForTaskInstance(theLastCompletedTaskInstance.Id); ITaskInstanceManager taskInstanceMgr = runtimeContext.TaskInstanceManager; for (int k = 0; k < workItemList.Count; k++) { IWorkItem completedWorkItem = (IWorkItem)workItemList[k]; IWorkItem newFromWorkItem = taskInstanceMgr.createWorkItem(currentSession, processInstance, taskInstance, completedWorkItem.ActorId); newFromWorkItem.claim();//并自动签收 } } else { IBeanFactory beanFactory = runtimeContext.BeanFactory; //从spring中获取到对应任务的Performer,创建工单 //201004 add lwz 参与者通过业务接口实现默认获取用户 switch (part.AssignmentType) { case AssignmentTypeEnum.Current: runtimeContext.AssignmentBusinessHandler.assignCurrent( currentSession, processInstance, (IAssignable)taskInstance); break; case AssignmentTypeEnum.Role: runtimeContext.AssignmentBusinessHandler.assignRole( currentSession, processInstance, (IAssignable)taskInstance, part.PerformerValue); break; case AssignmentTypeEnum.Agency: runtimeContext.AssignmentBusinessHandler.assignAgency( currentSession, processInstance, (IAssignable)taskInstance, part.PerformerValue); break; case AssignmentTypeEnum.Fixed: runtimeContext.AssignmentBusinessHandler.assignFixed( currentSession, processInstance, (IAssignable)taskInstance, part.PerformerValue); break; case AssignmentTypeEnum.Superiors: runtimeContext.AssignmentBusinessHandler.assignSuperiors( currentSession, processInstance, (IAssignable)taskInstance); break; default: IAssignmentHandler assignmentHandler = (IAssignmentHandler)beanFactory.GetBean(part.AssignmentHandler); //modified by wangmj 20090904 ((IAssignmentHandler)assignmentHandler).assign((IAssignable)taskInstance, part.PerformerValue); break; } } } }
// throws EngineException, KernelException public void run(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) { if (taskInstance.TaskType != TaskTypeEnum.SUBFLOW) { throw new EngineException(processInstance, taskInstance.Activity, "DefaultSubflowTaskInstanceRunner:TaskInstance的任务类型错误,只能为SUBFLOW类型"); } Task task = taskInstance.Task; SubWorkflowProcess Subflow = ((SubflowTask)task).SubWorkflowProcess; WorkflowDefinition subWorkflowDef = runtimeContext.DefinitionService.GetTheLatestVersionOfWorkflowDefinition(Subflow.WorkflowProcessId); if (subWorkflowDef == null) { WorkflowProcess parentWorkflowProcess = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, parentWorkflowProcess, taskInstance.TaskId, "系统中没有Id为" + Subflow.WorkflowProcessId + "的流程定义"); } WorkflowProcess subWorkflowProcess = subWorkflowDef.getWorkflowProcess(); if (subWorkflowProcess == null) { WorkflowProcess parentWorkflowProcess = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, parentWorkflowProcess, taskInstance.TaskId, "系统中没有Id为" + Subflow.WorkflowProcessId + "的流程定义"); } IPersistenceService persistenceService = runtimeContext.PersistenceService; //更改任务的状态和开始时间 ((TaskInstance)taskInstance).State = TaskInstanceStateEnum.RUNNING; ((TaskInstance)taskInstance).StartedTime = runtimeContext.CalendarService.getSysDate(); persistenceService.SaveOrUpdateTaskInstance(taskInstance); IProcessInstance subProcessInstance = currentSession.createProcessInstance(subWorkflowProcess.Name, taskInstance); //初始化流程变量,从父实例获得初始值 Dictionary<String, Object> processVars = ((TaskInstance)taskInstance).AliveProcessInstance.ProcessInstanceVariables; List<DataField> datafields = subWorkflowProcess.DataFields; for (int i = 0; datafields != null && i < datafields.Count; i++) { DataField df = (DataField)datafields[i]; if (df.DataType == DataTypeEnum.STRING) { if (processVars[df.Name] != null && (processVars[df.Name] is String)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { subProcessInstance.setProcessInstanceVariable(df.Name, df.InitialValue); } else { subProcessInstance.setProcessInstanceVariable(df.Name, ""); } } else if (df.DataType == DataTypeEnum.INTEGER) { if (processVars[df.Name] != null && (processVars[df.Name] is Int32)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { try { Int32 intValue = Int32.Parse(df.InitialValue); subProcessInstance.setProcessInstanceVariable(df.Name, intValue); } catch { } } else { subProcessInstance.setProcessInstanceVariable(df.Name, (Int32)0); } } else if (df.DataType == DataTypeEnum.FLOAT) { if (processVars[df.Name] != null && (processVars[df.Name] is float)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { float floatValue = float.Parse(df.InitialValue); subProcessInstance.setProcessInstanceVariable(df.Name, floatValue); } else { subProcessInstance.setProcessInstanceVariable(df.Name, (float)0); } } else if (df.DataType == DataTypeEnum.BOOLEAN) { if (processVars[df.Name] != null && (processVars[df.Name] is Boolean)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { Boolean booleanValue = Boolean.Parse(df.InitialValue); subProcessInstance.setProcessInstanceVariable(df.Name, booleanValue); } else { subProcessInstance.setProcessInstanceVariable(df.Name, false); } } else if (df.DataType == DataTypeEnum.DATETIME) { //TODO 需要完善一下 ( 父子流程数据传递——时间类型的数据还未做传递-不知道为什么?) //wmj2003 20090925 补充上了 if (processVars[df.Name] != null && (processVars[df.Name] is DateTime)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { try { DateTime dateTmp = DateTime.Parse(df.InitialValue); subProcessInstance.setProcessInstanceVariable(df.Name, dateTmp); } catch { subProcessInstance.setProcessInstanceVariable(df.Name, null); } } } //TODO 应将下面这句删除!这里还需要吗?应该直接subProcessInstance.run()就可以了。 runtimeContext.PersistenceService.SaveOrUpdateProcessInstance(subProcessInstance); subProcessInstance.run(); } }
/// <summary> /// 终止当前TaskInstance,检查是否可以中止当前ActivityInstance,如果可以, /// 则结束当前ActivityInstance,并触发targetActivityInstance或后继ActivityInstance /// </summary> /// <param name="currentSession"></param> /// <param name="processInstance"></param> /// <param name="taskInstance"></param> /// <param name="targetActivityInstance"></param> public void completeTaskInstance(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance, IActivityInstance targetActivityInstance) { //如果TaskInstance处于结束状态,则直接返回 if (taskInstance.State == TaskInstanceStateEnum.COMPLETED || taskInstance.State == TaskInstanceStateEnum.CANCELED) { return; } if (taskInstance.State == TaskInstanceStateEnum.INITIALIZED) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "Complete task insatance failed.The state of the task insatnce[id=" + taskInstance.Id + "] is " + taskInstance.State); } if (taskInstance.IsSuspended()) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "Complete task insatance failed. The task instance [id=" + taskInstance.Id + "] is suspended"); } if (targetActivityInstance != null) { ((TaskInstance)taskInstance).TargetActivityId=targetActivityInstance.Activity.Id; } IPersistenceService persistenceService = this.RuntimeContext.PersistenceService; //第一步,首先结束当前taskInstance if (!this.taskInstanceCanBeCompleted(currentSession, this.RuntimeContext, processInstance, taskInstance)) { return; } ((TaskInstance)taskInstance).State=TaskInstanceStateEnum.COMPLETED; ((TaskInstance)taskInstance).CanBeWithdrawn=false; ((TaskInstance)taskInstance).EndTime=RuntimeContext.CalendarService.getSysDate(); persistenceService.SaveOrUpdateTaskInstance(taskInstance); //触发相应的事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=taskInstance; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.AFTER_TASK_INSTANCE_COMPLETE; if (this.DefaultTaskInstanceEventListener != null) { this.DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(taskInstance, e); //第二步,检查ActivityInstance是否可以结束 if (!activityInstanceCanBeCompleted(taskInstance)) { return; } //第三步,尝试结束对应的activityInstance List<IToken> tokens = persistenceService.FindTokensForProcessInstance(taskInstance.ProcessInstanceId, taskInstance.ActivityId); // System.out.println("Inside TaskInstance.complete(targetActivityInstance):: tokens.size is "+tokens.Count); if (tokens == null || tokens.Count == 0) { return;//表明activityInstance已经结束了。 } if (tokens.Count > 1) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "与activityId=" + taskInstance.ActivityId + "对应的token数量(=" + tokens.Count + ")不正确,正确只能为1,因此无法完成complete操作"); } IToken token = tokens[0]; //stepNumber不相等,不允许执行结束操作。 if (token.StepNumber != taskInstance.StepNumber) { return; } if (token.IsAlive == false) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "与activityId=" + taskInstance.ActivityId + "对应的token.alive=false,因此无法完成complete操作"); } INetInstance netInstance = this.RuntimeContext.KernelManager.getNetInstance(taskInstance.ProcessId, taskInstance.Version); Object obj = netInstance.getWFElementInstance(taskInstance.ActivityId); if (obj == null) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "系统没有找到与activityId=" + taskInstance.ActivityId + "对应activityInstance,无法执行complete操作。"); } token.ProcessInstance = processInstance; ((IActivityInstance)obj).complete(token, targetActivityInstance); }
// throws EngineException, KernelException /// <summary>分配, 按照当前任务的参与者插入工单</summary> /// <param name="currentSession"></param> /// <param name="processInstance"></param> /// <param name="runtimeContext"></param> /// <param name="taskInstance"></param> /// <param name="formTask"></param> /// <param name="part"></param> /// <param name="dynamicAssignmentHandler"></param> protected void assign(IWorkflowSession currentSession, IProcessInstance processInstance, RuntimeContext runtimeContext, ITaskInstance taskInstance, FormTask formTask, Participant part, DynamicAssignmentHandler dynamicAssignmentHandler) { //如果有指定的Actor,则按照指定的Actor分配任务 if (dynamicAssignmentHandler != null) { dynamicAssignmentHandler.assign((IAssignable)taskInstance, part.Name); } else { IPersistenceService persistenceService = runtimeContext.PersistenceService; List<ITaskInstance> taskInstanceList = persistenceService.FindTaskInstancesForProcessInstance(taskInstance.ProcessInstanceId, taskInstance.ActivityId); ITaskInstance theLastCompletedTaskInstance = null; for (int i = 0; taskInstanceList != null && i < taskInstanceList.Count; i++) { ITaskInstance tmp = (ITaskInstance)taskInstanceList[i]; if (tmp.Id.Equals(taskInstance.Id)) continue; if (!tmp.TaskId.Equals(taskInstance.TaskId)) continue; if (tmp.State != TaskInstanceStateEnum.COMPLETED) continue; if (theLastCompletedTaskInstance == null) { theLastCompletedTaskInstance = tmp; } else { if (theLastCompletedTaskInstance.StepNumber < tmp.StepNumber) { theLastCompletedTaskInstance = tmp; } } } //如果是循环且LoopStrategy==REDO,则分配个上次完成该工作的操作员 if (theLastCompletedTaskInstance != null && (LoopStrategyEnum.REDO==formTask.LoopStrategy || currentSession.isInWithdrawOrRejectOperation())) { List<IWorkItem> workItemList = persistenceService.FindCompletedWorkItemsForTaskInstance(theLastCompletedTaskInstance.Id); ITaskInstanceManager taskInstanceMgr = runtimeContext.TaskInstanceManager; for (int k = 0; k < workItemList.Count; k++) { IWorkItem completedWorkItem = (IWorkItem)workItemList[k]; IWorkItem newFromWorkItem = taskInstanceMgr.createWorkItem(currentSession, processInstance, taskInstance, completedWorkItem.ActorId); newFromWorkItem.claim();//并自动签收 } } else { IBeanFactory beanFactory = runtimeContext.BeanFactory; //从spring中获取到对应任务的Performer,创建工单 //201004 add lwz 参与者通过业务接口实现默认获取用户 switch (part.AssignmentType) { case AssignmentTypeEnum.Current: runtimeContext.AssignmentBusinessHandler.assignCurrent( currentSession, processInstance, (IAssignable)taskInstance); break; case AssignmentTypeEnum.Role: runtimeContext.AssignmentBusinessHandler.assignRole( currentSession, processInstance, (IAssignable)taskInstance, part.PerformerValue); break; case AssignmentTypeEnum.Agency: runtimeContext.AssignmentBusinessHandler.assignAgency( currentSession, processInstance, (IAssignable)taskInstance, part.PerformerValue); break; case AssignmentTypeEnum.Fixed: runtimeContext.AssignmentBusinessHandler.assignFixed( currentSession, processInstance, (IAssignable)taskInstance, part.PerformerValue); break; case AssignmentTypeEnum.Superiors: runtimeContext.AssignmentBusinessHandler.assignSuperiors( currentSession, processInstance, (IAssignable)taskInstance); break; default: IAssignmentHandler assignmentHandler = (IAssignmentHandler)beanFactory.GetBean(part.AssignmentHandler); //modified by wangmj 20090904 ((IAssignmentHandler)assignmentHandler).assign((IAssignable)taskInstance, part.PerformerValue); break; } } } }
protected void afterWorkItemComplete(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance, IWorkItem workItem) { // System.out.println("---------------------------------after workitem complete!!!!!!!!!!!!!!"); }
protected void afterWorkItemCreated(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance, IWorkItem workItem)//throws EngineException { }
protected void afterTaskInstanceCompleted(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance)//throws EngineException { }
protected void beforeTaskInstanceStart(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance)//throws EngineException { }
public WorkItem createWorkItem(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance, String actorId) { IPersistenceService persistenceService = this.RuntimeContext.PersistenceService; WorkItem wi = new WorkItem(); wi.TaskInstance=taskInstance; wi.ActorId=actorId; wi.State=WorkItemEnum.INITIALIZED; wi.CreatedTime = this.RuntimeContext.CalendarService.getSysDate(); wi.RuntimeContext = this.RuntimeContext; wi.CurrentWorkflowSession=currentSession; //保存到数据库 persistenceService.SaveOrUpdateWorkItem(wi); //触发事件 //触发相应的事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=taskInstance; e.WorkItem=wi; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.AFTER_WORKITEM_CREATED; if (this.DefaultTaskInstanceEventListener != null) { this.DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(taskInstance, e); return wi; }
/// <summary> /// 启动TaskInstance。 /// 该方法定义为final,不允许子类扩展。 /// </summary> public void startTaskInstance(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance) { //触发事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=taskInstance; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.BEFORE_TASK_INSTANCE_START; if (DefaultTaskInstanceEventListener != null) { DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(taskInstance, e); ((TaskInstance)taskInstance).State=TaskInstanceStateEnum.RUNNING; ((TaskInstance)taskInstance).StartedTime=this.RuntimeContext.CalendarService.getSysDate(); this.RuntimeContext.PersistenceService.SaveOrUpdateTaskInstance(taskInstance); Task task = taskInstance.Task; String taskInstanceRunnerName = null; ITaskInstanceRunner taskInstanceRunner = null; TaskTypeEnum taskType = task.TaskType; taskInstanceRunnerName = task.TaskInstanceRunner; if (!String.IsNullOrEmpty(taskInstanceRunnerName.Trim())) { IBeanFactory beanFactory = this.RuntimeContext.BeanFactory; taskInstanceRunner = (ITaskInstanceRunner)beanFactory.GetBean(taskInstanceRunnerName); } if (taskInstanceRunner == null) { if (TaskTypeEnum.FORM == taskType) { taskInstanceRunnerName = processInstance.WorkflowProcess.FormTaskInstanceRunner; } else if (TaskTypeEnum.TOOL == taskType) { taskInstanceRunnerName = processInstance.WorkflowProcess.ToolTaskInstanceRunner; } else if (TaskTypeEnum.SUBFLOW == taskType) { taskInstanceRunnerName = processInstance.WorkflowProcess.SubflowTaskInstanceRunner; } if (!String.IsNullOrEmpty(taskInstanceRunnerName.Trim())) { IBeanFactory beanFactory = this.RuntimeContext.BeanFactory; taskInstanceRunner = (ITaskInstanceRunner)beanFactory.GetBean(taskInstanceRunnerName); } } if (taskInstanceRunner == null) { if (TaskTypeEnum.FORM == taskType) { taskInstanceRunner = DefaultFormTaskInstanceRunner; } else if (TaskTypeEnum.TOOL == taskType) { taskInstanceRunner = DefaultToolTaskInstanceRunner; } else if (TaskTypeEnum.SUBFLOW == taskType) { taskInstanceRunner = DefaultSubflowTaskInstanceRunner; } } if (taskInstanceRunner != null) { taskInstanceRunner.run(currentSession, this.RuntimeContext, processInstance, taskInstance); } else { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "无法获取TaskInstanceRunner,TaskId=" + task.Id + ", taskType=" + taskInstance.TaskType); } }
// throws EngineException public ITaskInstance createTaskInstance(IWorkflowSession currentSession, IProcessInstance processInstance, Task task, Activity activity) { //如果loopStrategy为SKIP且Task被执行过,则直接返回null; IPersistenceService persistenceService = this.RuntimeContext.PersistenceService; LoopStrategyEnum loopStrategy = task.LoopStrategy; if (LoopStrategyEnum.SKIP == loopStrategy && !currentSession.isInWithdrawOrRejectOperation()) { //检查是否已经执行过的task instance Int32 count = persistenceService.GetCompletedTaskInstanceCountForTask(processInstance.Id, task.Id); if (count > 0) { return null; } } String taskInstanceCreatorName = null; ITaskInstanceCreator taskInstanceCreator = null; //首先查找Task级别的TaskInstanceCreator taskInstanceCreatorName = task.TaskInstanceCreator; if (!String.IsNullOrEmpty(taskInstanceCreatorName.Trim())) { IBeanFactory beanFactory = this.RuntimeContext.BeanFactory; taskInstanceCreator = (ITaskInstanceCreator)beanFactory.GetBean(taskInstanceCreatorName); } //如果没有,则查询流程级别的TaskInstanceCreator if (taskInstanceCreator == null) { taskInstanceCreatorName = processInstance.WorkflowProcess.TaskInstanceCreator; if (!String.IsNullOrEmpty(taskInstanceCreatorName.Trim())) { IBeanFactory beanFactory = this.RuntimeContext.BeanFactory; taskInstanceCreator = (ITaskInstanceCreator)beanFactory.GetBean(taskInstanceCreatorName); } } //如果流程定义中也没有指定TaskInstanceCreator,则用缺省的 if (taskInstanceCreator == null) { taskInstanceCreator = DefaultTaskInstanceCreator; } return taskInstanceCreator.createTaskInstance(currentSession, RuntimeContext, processInstance, task, activity); }
//throws EngineException ,KernelException /// <summary> /// 判断任务实例是否可以终止 /// </summary> /// <param name="currentSession"></param> /// <param name="runtimeContext"></param> /// <param name="processInstance"></param> /// <param name="taskInstance"></param> /// <returns>true表示可以终止,false不能终止</returns> public Boolean taskInstanceCanBeCompleted(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) { //Tool类型的TaskInstance在handler执行完后,都可以直接结束。 return true; }
public bool taskInstanceCanBeCompleted(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) { IPersistenceService persistenceService = runtimeContext.PersistenceService; List<IWorkItem> workItems = persistenceService.FindWorkItemsForTaskInstance(taskInstance.Id); //从流程变量中获取业务流水号 String sn = (String)processInstance.getProcessInstanceVariable("sn"); //已经完成的WorkItem数量 int completedWorkItemCount = 0; //审批同意的决定的数量 int approvedDecitionCount = 0; StringBuilder examinerList = new StringBuilder();//所有审核人名单 StringBuilder approverList = new StringBuilder();//同意者名单 StringBuilder opponentList = new StringBuilder();//不同意者名单 for (int i = 0; i < workItems.Count; i++) { IWorkItem wi = workItems[i]; if (wi.State == WorkItemEnum.COMPLETED) { completedWorkItemCount++; WebDemo.Example.LoanProcess.Persistence.ApproveInfo approveInfo = approveInfoDAO.findBySnAndUserId(sn, wi.ActorId); if (approveInfo != null) { examinerList.Append(approveInfo.Approver).Append(","); if (approveInfo.Decision) { approvedDecitionCount++; approverList.Append(approveInfo.Approver).Append(","); } else { opponentList.Append(approveInfo.Approver).Append(","); } } } } //------------------判断是否可以结束该汇签任务----------- float size =(float)workItems.Count; float theRule = 2 / 3f; float currentCompletedPercentage = completedWorkItemCount / size;//已经完成的工单占总工单的比例 float currentAggreePercentage = approvedDecitionCount / size;//已经同意的比例 //如果完成的工单数量小于2/3,则直接返回false,即不可以结束TaskInstance if (currentCompletedPercentage < theRule) { return false; } //如果同意的数量达到2/3则直接结束TaskInstance else if (currentAggreePercentage >= theRule) { //修改流程变量的值 processInstance.setProcessInstanceVariable("Decision", true); //将最终审批决定纪录到业务表中 LoanInfo loanInfo = loanInfoDAO.findBySn(sn); if (loanInfo!=null) { loanInfo.Decision = true; loanInfo.ExaminerList=examinerList.ToString(); loanInfo.ApproverList=approverList.ToString(); loanInfo.OpponentList=opponentList.ToString(); loanInfoDAO.attachDirty(loanInfo); } return true; } //当所有的workItem结束时,可以结束TaskInstance else if (completedWorkItemCount == workItems.Count) { LoanInfo loanInfo = loanInfoDAO.findBySn(sn); if (currentAggreePercentage < theRule) { //修改流程变量的值 processInstance.setProcessInstanceVariable("Decision", false); //将最终审批决定记录到业务表中 if (loanInfo != null) loanInfo.Decision = false; loanInfo.ExaminerList=examinerList.ToString(); loanInfo.ApproverList=approverList.ToString(); loanInfo.OpponentList=opponentList.ToString(); loanInfoDAO.attachDirty(loanInfo); } else { //修改流程变量的值 processInstance.setProcessInstanceVariable("Decision", true); //将最终审批决定记录到业务表中 if (loanInfo != null) loanInfo.Decision = true; loanInfo.ExaminerList=examinerList.ToString(); loanInfo.ApproverList=approverList.ToString(); loanInfo.OpponentList=opponentList.ToString(); loanInfoDAO.attachDirty(loanInfo); } return true; } return false; }
/// <summary> /// 中止当前的TaskInstance,并使得流程流转到指定的环节。 /// </summary> /// <param name="currentSession"></param> /// <param name="processInstance"></param> /// <param name="taskInstance"></param> /// <param name="targetActivityId"></param> public void abortTaskInstance(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance taskInstance, String targetActivityId) { // 如果TaskInstance处于结束状态,则直接返回 if (taskInstance.State == TaskInstanceStateEnum.COMPLETED || taskInstance.State == TaskInstanceStateEnum.CANCELED) { return; } // Initialized状态的TaskInstance也可以中止,20090830 // if (taskInstance.State == ITaskInstance.INITIALIZED) { // WorkflowProcess process = taskInstance.getWorkflowProcess(); // throw new EngineException(taskInstance.getProcessInstanceId(), // process, // taskInstance.getTaskId(), // "Complete task insatance failed.The state of the task insatnce[id=" + // taskInstance.getId() + "] is " + taskInstance.State); // } if (taskInstance.IsSuspended()) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "Abort task insatance failed. The task instance [id=" + taskInstance.Id + "] is suspended"); } // 1)检查是否在同一个“执行线”上 WorkflowProcess workflowProcess = taskInstance.WorkflowProcess; if (targetActivityId != null) { String thisActivityId = taskInstance.ActivityId; Boolean isInSameLine = workflowProcess.isInSameLine(thisActivityId, targetActivityId); if (!isInSameLine) { throw new EngineException( taskInstance.ProcessInstanceId, taskInstance.WorkflowProcess, taskInstance.TaskId, "Jumpto refused because of the current activitgy and the target activity are NOT in the same 'Execution Thread'."); } } INetInstance netInstance = this.RuntimeContext.KernelManager.getNetInstance(workflowProcess.Id, taskInstance.Version); IActivityInstance targetActivityInstance = (IActivityInstance)netInstance.getWFElementInstance(targetActivityId); IActivityInstance thisActivityInstance = (IActivityInstance)netInstance.getWFElementInstance(taskInstance.ActivityId); if (thisActivityInstance == null) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "系统没有找到与activityId=" + taskInstance.ActivityId + "对应activityInstance,无法执行abort操作。"); } if (targetActivityInstance != null) { ((TaskInstance)taskInstance).TargetActivityId=targetActivityInstance.Activity.Id; } IPersistenceService persistenceService = this.RuntimeContext.PersistenceService; // 第一步,首先Abort当前taskInstance persistenceService.AbortTaskInstance((TaskInstance)taskInstance); // 触发相应的事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=taskInstance; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.AFTER_TASK_INSTANCE_COMPLETE; if (this.DefaultTaskInstanceEventListener != null) { this.DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(taskInstance, e); // 第二步,检查ActivityInstance是否可以结束 if (!activityInstanceCanBeCompleted(taskInstance)) { return; } // 第三步,尝试结束对应的activityInstance List<IToken> tokens = persistenceService.FindTokensForProcessInstance(taskInstance.ProcessInstanceId, taskInstance.ActivityId); // System.out.println("Inside TaskInstance.complete(targetActivityInstance):: tokens.size is "+tokens.size()); if (tokens == null || tokens.Count == 0) { return;// 表明activityInstance已经结束了。 } if (tokens.Count > 1) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "与activityId=" + taskInstance.ActivityId + "对应的token数量(=" + tokens.Count + ")不正确,正确只能为1,因此无法完成complete操作"); } IToken token = tokens[0]; // stepNumber不相等,不允许执行结束操作。 if (token.StepNumber != taskInstance.StepNumber) { return; } if (token.IsAlive == false) { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "与activityId=" + taskInstance.ActivityId + "对应的token.alive=false,因此无法完成complete操作"); } token.ProcessInstance = processInstance; thisActivityInstance.complete(token, targetActivityInstance); }
// throws EngineException public ITaskInstance createTaskInstance(IWorkflowSession currentSession, RuntimeContext runtimeContxt, IProcessInstance processInstance, Task task, Activity activity) { TaskInstance taskInstance = new TaskInstance(); return taskInstance; }
public void run(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance)// throws EngineException, KernelException { if (taskInstance.TaskType != TaskTypeEnum.SUBFLOW) { throw new EngineException(processInstance, taskInstance.Activity, "DefaultSubflowTaskInstanceRunner:TaskInstance的任务类型错误,只能为SUBFLOW类型"); } Task task = taskInstance.Task; SubWorkflowProcess Subflow = ((SubflowTask)task).SubWorkflowProcess; WorkflowDefinition subWorkflowDef = runtimeContext.DefinitionService.GetTheLatestVersionOfWorkflowDefinition(Subflow.WorkflowProcessId); if (subWorkflowDef == null) { WorkflowProcess parentWorkflowProcess = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, parentWorkflowProcess, taskInstance.TaskId, "系统中没有Id为" + Subflow.WorkflowProcessId + "的流程定义"); } WorkflowProcess subWorkflowProcess = subWorkflowDef.getWorkflowProcess(); if (subWorkflowProcess == null) { WorkflowProcess parentWorkflowProcess = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, parentWorkflowProcess, taskInstance.TaskId, "系统中没有Id为" + Subflow.WorkflowProcessId + "的流程定义"); } IPersistenceService persistenceService = runtimeContext.PersistenceService; //更改任务的状态和开始时间 ((TaskInstance)taskInstance).State = TaskInstanceStateEnum.RUNNING; ((TaskInstance)taskInstance).StartedTime = runtimeContext.CalendarService.getSysDate(); persistenceService.SaveOrUpdateTaskInstance(taskInstance); IProcessInstance subProcessInstance = currentSession.createProcessInstance(subWorkflowProcess.Name, taskInstance); //初始化流程变量,从父实例获得初始值 Dictionary <String, Object> processVars = ((TaskInstance)taskInstance).AliveProcessInstance.ProcessInstanceVariables; List <DataField> datafields = subWorkflowProcess.DataFields; for (int i = 0; datafields != null && i < datafields.Count; i++) { DataField df = (DataField)datafields[i]; if (df.DataType == DataTypeEnum.STRING) { if (processVars[df.Name] != null && (processVars[df.Name] is String)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { subProcessInstance.setProcessInstanceVariable(df.Name, df.InitialValue); } else { subProcessInstance.setProcessInstanceVariable(df.Name, ""); } } else if (df.DataType == DataTypeEnum.INTEGER) { if (processVars[df.Name] != null && (processVars[df.Name] is Int32)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { try { Int32 intValue = Int32.Parse(df.InitialValue); subProcessInstance.setProcessInstanceVariable(df.Name, intValue); } catch { } } else { subProcessInstance.setProcessInstanceVariable(df.Name, (Int32)0); } } else if (df.DataType == DataTypeEnum.FLOAT) { if (processVars[df.Name] != null && (processVars[df.Name] is float)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { float floatValue = float.Parse(df.InitialValue); subProcessInstance.setProcessInstanceVariable(df.Name, floatValue); } else { subProcessInstance.setProcessInstanceVariable(df.Name, (float)0); } } else if (df.DataType == DataTypeEnum.BOOLEAN) { if (processVars[df.Name] != null && (processVars[df.Name] is Boolean)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { Boolean booleanValue = Boolean.Parse(df.InitialValue); subProcessInstance.setProcessInstanceVariable(df.Name, booleanValue); } else { subProcessInstance.setProcessInstanceVariable(df.Name, false); } } else if (df.DataType == DataTypeEnum.DATETIME) { //TODO 需要完善一下 ( 父子流程数据传递——时间类型的数据还未做传递-不知道为什么?) //wmj2003 20090925 补充上了 if (processVars[df.Name] != null && (processVars[df.Name] is DateTime)) { subProcessInstance.setProcessInstanceVariable(df.Name, processVars[df.Name]); } else if (df.InitialValue != null) { try { DateTime dateTmp = DateTime.Parse(df.InitialValue); subProcessInstance.setProcessInstanceVariable(df.Name, dateTmp); } catch { subProcessInstance.setProcessInstanceVariable(df.Name, null); } } } //TODO 应将下面这句删除!这里还需要吗?应该直接subProcessInstance.run()就可以了。 runtimeContext.PersistenceService.SaveOrUpdateProcessInstance(subProcessInstance); subProcessInstance.run(); } }
/// <summary> /// 判断TaskInstance是否可以结束,缺省的判断规则是:没有活动的WorkItem即可结束。 /// 业务代码可以重载该函数,对特定的Task采取特殊的判断规则。 /// </summary> /// <param name="currentSession"></param> /// <param name="runtimeContext"></param> /// <param name="processInstance"></param> /// <param name="taskInstance"></param> /// <returns></returns> protected Boolean taskInstanceCanBeCompleted(IWorkflowSession currentSession, RuntimeContext runtimeContext, IProcessInstance processInstance, ITaskInstance taskInstance) { Task task = taskInstance.Task; String taskInstanceCompletionEvaluatorName = null; ITaskInstanceCompletionEvaluator taskInstanceCompletionEvaluator = null; TaskTypeEnum taskType = task.TaskType; taskInstanceCompletionEvaluatorName = task.TaskInstanceCompletionEvaluator; if (!String.IsNullOrEmpty(taskInstanceCompletionEvaluatorName.Trim())) { IBeanFactory beanFactory = runtimeContext.BeanFactory; taskInstanceCompletionEvaluator = (ITaskInstanceCompletionEvaluator)beanFactory.GetBean(taskInstanceCompletionEvaluatorName); } if (taskInstanceCompletionEvaluator == null) { if (TaskTypeEnum.FORM == taskType) { taskInstanceCompletionEvaluatorName = processInstance.WorkflowProcess.FormTaskInstanceCompletionEvaluator; } else if (TaskTypeEnum.TOOL == taskType) { taskInstanceCompletionEvaluatorName = processInstance.WorkflowProcess.ToolTaskInstanceCompletionEvaluator; } else if (TaskTypeEnum.SUBFLOW == taskType) { taskInstanceCompletionEvaluatorName = processInstance.WorkflowProcess.SubflowTaskInstanceCompletionEvaluator; } if (!String.IsNullOrEmpty(taskInstanceCompletionEvaluatorName.Trim())) { IBeanFactory beanFactory = runtimeContext.BeanFactory; taskInstanceCompletionEvaluator = (ITaskInstanceCompletionEvaluator)beanFactory.GetBean(taskInstanceCompletionEvaluatorName); } } if (taskInstanceCompletionEvaluator == null) { if (TaskTypeEnum.FORM == taskType) { taskInstanceCompletionEvaluator = this.DefaultFormTaskInstanceCompletionEvaluator; } else if (TaskTypeEnum.TOOL == taskType) { taskInstanceCompletionEvaluator = this.DefaultToolTaskInstanceCompletionEvaluator; } else if (TaskTypeEnum.SUBFLOW == taskType) { taskInstanceCompletionEvaluator = this.DefaultSubflowTaskInstanceCompletionEvaluator; } } if (taskInstanceCompletionEvaluator != null) { return taskInstanceCompletionEvaluator.taskInstanceCanBeCompleted(currentSession, runtimeContext, processInstance, taskInstance); } else { WorkflowProcess process = taskInstance.WorkflowProcess; throw new EngineException(taskInstance.ProcessInstanceId, process, taskInstance.TaskId, "无法获取TaskInstanceCompletionEvaluator,TaskId=" + task.Id + ", taskType=" + taskInstance.TaskType); } }
public void abortTaskInstanceEx(IWorkflowSession currentSession, IProcessInstance processInstance, ITaskInstance thisTaskInst, String targetActivityId) { // 如果TaskInstance处于结束状态,则直接返回 if (thisTaskInst.State == TaskInstanceStateEnum.COMPLETED || thisTaskInst.State == TaskInstanceStateEnum.CANCELED) { return; } // Initialized状态的TaskInstance也可以中止,20090830 // if (taskInstance.State == ITaskInstance.INITIALIZED) { // WorkflowProcess process = taskInstance.getWorkflowProcess(); // throw new EngineException(taskInstance.getProcessInstanceId(), // process, // taskInstance.getTaskId(), // "Complete task insatance failed.The state of the task insatnce[id=" + // taskInstance.getId() + "] is " + taskInstance.State); // } if (thisTaskInst.IsSuspended()) { WorkflowProcess process = thisTaskInst.WorkflowProcess; throw new EngineException(thisTaskInst.ProcessInstanceId, process, thisTaskInst.TaskId, "Abort task insatance failed. The task instance [id=" + thisTaskInst.Id + "] is suspended"); } // IPersistenceService persistenceService = this.RuntimeContext.PersistenceService; WorkflowProcess workflowProcess = thisTaskInst.WorkflowProcess; List<IToken> allTokens = null; List<String> aliveActivityIdsAfterJump = new List<String>(); if (targetActivityId != null) { String thisActivityId = thisTaskInst.ActivityId; Boolean isInSameLine = workflowProcess.isInSameLine(thisActivityId, targetActivityId); if (isInSameLine) { this.abortTaskInstance(currentSession, processInstance, thisTaskInst, targetActivityId); } //合法性检查 allTokens = persistenceService.FindTokensForProcessInstance(thisTaskInst.ProcessInstanceId, null); aliveActivityIdsAfterJump.Add(targetActivityId); for (int i = 0; allTokens != null && i < allTokens.Count; i++) { IToken tokenTmp = allTokens[i]; IWFElement workflowElement = workflowProcess.findWFElementById(tokenTmp.NodeId); if ((workflowElement is Activity) && !workflowElement.Id.Equals(thisActivityId)) { aliveActivityIdsAfterJump.Add(workflowElement.Id); if (workflowProcess.isReachable(targetActivityId, workflowElement.Id) || workflowProcess.isReachable(workflowElement.Id, targetActivityId)) { throw new EngineException( thisTaskInst.ProcessInstanceId, thisTaskInst.WorkflowProcess, thisTaskInst.TaskId, "Abort refused because of the business-logic conflict!"); } } } //1)检查是否在同一个“执行线”上(不做该检查,20091008) // if (!isInSameLine) { // throw new EngineException( // taskInstance.getProcessInstanceId(), // taskInstance.getWorkflowProcess(), // taskInstance.getTaskId(), // "Jumpto refused because of the current activitgy and the target activity are NOT in the same 'Execution Thread'."); // } } INetInstance netInstance = this.RuntimeContext.KernelManager.getNetInstance(workflowProcess.Id, thisTaskInst.Version); IActivityInstance targetActivityInstance = null; if (targetActivityId != null) { targetActivityInstance = (IActivityInstance)netInstance.getWFElementInstance(targetActivityId); } IActivityInstance thisActivityInstance = (IActivityInstance)netInstance.getWFElementInstance(thisTaskInst.ActivityId); if (thisActivityInstance == null) { WorkflowProcess process = thisTaskInst.WorkflowProcess; throw new EngineException(thisTaskInst.ProcessInstanceId, process, thisTaskInst.TaskId, "系统没有找到与activityId=" + thisTaskInst.ActivityId + "对应activityInstance,无法执行abort操作。"); } if (targetActivityInstance != null) { ((TaskInstance)thisTaskInst).TargetActivityId=targetActivityInstance.Activity.Id; } // 第一步,首先Abort当前taskInstance persistenceService.AbortTaskInstance((TaskInstance)thisTaskInst); // 触发相应的事件 TaskInstanceEvent e = new TaskInstanceEvent(); e.Source=thisTaskInst; e.WorkflowSession=currentSession; e.ProcessInstance=processInstance; e.EventType = TaskInstanceEventEnum.AFTER_TASK_INSTANCE_COMPLETE; if (this.DefaultTaskInstanceEventListener != null) { this.DefaultTaskInstanceEventListener.onTaskInstanceEventFired(e); } this.fireTaskInstanceEvent(thisTaskInst, e); // 第二步,检查ActivityInstance是否可以结束 if (!activityInstanceCanBeCompleted(thisTaskInst)) { return; } // 第三步,尝试结束对应的activityInstance List<IToken> tokens = persistenceService.FindTokensForProcessInstance(thisTaskInst.ProcessInstanceId, thisTaskInst.ActivityId); // System.out.println("Inside TaskInstance.complete(targetActivityInstance):: tokens.size is "+tokens.size()); if (tokens == null || tokens.Count == 0) { return;// 表明activityInstance已经结束了。 } if (tokens.Count > 1) { WorkflowProcess process = thisTaskInst.WorkflowProcess; throw new EngineException(thisTaskInst.ProcessInstanceId, process, thisTaskInst.TaskId, "与activityId=" + thisTaskInst.ActivityId + "对应的token数量(=" + tokens.Count + ")不正确,正确只能为1,因此无法完成complete操作"); } IToken token = tokens[0]; // stepNumber不相等,不允许执行结束操作。 if (token.StepNumber != thisTaskInst.StepNumber) { return; } if (token.IsAlive == false) { WorkflowProcess process = thisTaskInst.WorkflowProcess; throw new EngineException(thisTaskInst.ProcessInstanceId, process, thisTaskInst.TaskId, "与activityId=" + thisTaskInst.ActivityId + "对应的token.alive=false,因此无法完成complete操作"); } token.ProcessInstance = processInstance; //调整token布局 if (targetActivityId != null) { List<Synchronizer> allSynchronizersAndEnds = new List<Synchronizer>(); allSynchronizersAndEnds.AddRange(workflowProcess.Synchronizers); allSynchronizersAndEnds.AddRange((IEnumerable<Synchronizer>)workflowProcess.EndNodes.ToArray()); //allSynchronizersAndEnds.AddRange((List<Synchronizer>)); for (int i = 0; i < allSynchronizersAndEnds.Count; i++) { Synchronizer synchronizer = allSynchronizersAndEnds[i]; if (synchronizer.Name.Equals("Synchronizer4")) { //System.out.println(synchronizer.Name); } int volumn = 0; if (synchronizer is EndNode) { volumn = synchronizer.EnteringTransitions.Count; } else { volumn = synchronizer.EnteringTransitions.Count * synchronizer.LeavingTransitions.Count; } IToken tokenTmp = new Token(); tokenTmp.NodeId = synchronizer.Id; tokenTmp.IsAlive = false; tokenTmp.ProcessInstanceId = thisTaskInst.ProcessInstanceId; tokenTmp.StepNumber = -1; List<String> incomingTransitionIds = new List<String>(); Boolean reachable = false; List<Transition> enteringTrans = synchronizer.EnteringTransitions; for (int m = 0; m < aliveActivityIdsAfterJump.Count; m++) { String aliveActivityId = aliveActivityIdsAfterJump[m]; if (workflowProcess.isReachable(aliveActivityId, synchronizer.Id)) { Transition trans = null; reachable = true; for (int j = 0; j < enteringTrans.Count; j++) { trans = enteringTrans[j]; Node fromNode = (Node)trans.FromNode; if (workflowProcess.isReachable(aliveActivityId, fromNode.Id)) { if (!incomingTransitionIds.Contains(trans.Id)) { incomingTransitionIds.Add(trans.Id); } } } } } if (reachable) { tokenTmp.Value = volumn - (incomingTransitionIds.Count * volumn / enteringTrans.Count); IToken virtualToken = getJoinInfo(allTokens, synchronizer.Id); if (virtualToken != null) { persistenceService.DeleteTokensForNode(thisTaskInst.ProcessInstanceId, synchronizer.Id); } if (tokenTmp.Value != 0) { tokenTmp.ProcessInstance = processInstance; persistenceService.SaveOrUpdateToken(tokenTmp); } } } } thisActivityInstance.complete(token, targetActivityInstance); }