activity工作流框架使用示例

1.构建流程图,示例如下:

2.发起流程

public void startProcess(AirBlowingBaseInfo airBlowingBaseInfo) {
   List<String> personList = new ArrayList<String>();
   AirTaskInfo airTaskInfo = airBlowingBaseInfo.getAirTaskInfo();
   Map<String,Object> vars = new HashMap<String,Object>();
   if(null != airTaskInfo.getFormCirculateuserCylinder() && !airTaskInfo.getFormCirculateuserCylinder().equals("")) {
      vars.put("formCirculateuserMotion",airTaskInfo.getFormCirculateuserMotion());
      //此处的formCirculateuserMotion为1节点的分配用户
      vars.put("formCirculateuserCylinder",airTaskInfo.getFormCirculateuserCylinder());
      //此处的formCirculateuserCylinder为2节点的分配用户
   }
   AirTaskInfo airTaskInfo1 = airTaskInfoService.get(airTaskInfo);
   String conmment = (airBlowingBaseInfo.getAirTaskInfo()==null||airBlowingBaseInfo.getAirTaskInfo().getAct()==null||airBlowingBaseInfo.getAirTaskInfo().getAct().getComment()==null)?"":airBlowingBaseInfo.getAirTaskInfo().getAct().getComment();
   actTaskService.startProcess(airTaskInfo1.getCreateBy().getLoginName(),ActUtils.PD_AIRWAY_BLOWING_PROCESS[0], ActUtils.PD_AIRWAY_BLOWING_PROCESS[1], airTaskInfo1.getId(), "流程", vars,conmment);
//此处的ActUtils.PD_AIRWAY_BLOWING_PROCESS[0]为流程图的流程标识ActUtils.PD_AIRWAY_BLOWING_PROCESS[1]为数据库中业务表名
   //更新defid
   String defid=actTaskService.getProcessDefinitionId(ActUtils.PD_AIRWAY_BLOWING_PROCESS[0]);
   airTaskInfo.setProcessDefinitionId(defid);
   airTaskInfo.setUpdateBy(UserUtils.getUser());
   airTaskInfoService.updateDefId(airTaskInfo);
}

3.推进并结束流程

public void completeProcess(AirTaskInfo airTaskInfo,String cirLoginNames) {
//    boolean reject = false;
      String startName=null;
      List<String> personList = new ArrayList<String>();
      //流程参数变量
      Map<String, Object> vars = Maps.newHashMap();
      // 设置意见
      String comment="";
      if("yes".equals(airTaskInfo.getAct().getFlag())){
         comment="[同意] "+(airTaskInfo.getAct().getComment()==null?"":airTaskInfo.getAct().getComment());
      }else if("no".equals(airTaskInfo.getAct().getFlag())){
         comment="[驳回] "+(airTaskInfo.getAct().getComment()==null?"":airTaskInfo.getAct().getComment());
      }else{
         comment=airTaskInfo.getAct().getComment()==null?"":airTaskInfo.getAct().getComment();
      }
      airTaskInfo.getAct().setComment(comment);
//    vars.put("pass", "yes".equals(materialTaskInfo.getAct().getFlag())? "1" : "0");
      // 对不同环节的业务逻辑进行操作
      String taskDefKey = airTaskInfo.getAct().getTaskDefKey();
      AirTaskInfo airTaskInfo1 = this.get1(airTaskInfo.getId());
      if("form_circulate_cylinder".equals(taskDefKey)){ //1节点id
//       String apply=airTaskInfo1.getCreateBy().getLoginName();
         if("0".equals(airTaskInfo.getFormType())){
            String apply=airTaskInfo1.getCreateBy().getLoginName();
            vars.put("apply",apply);
            vars.put("pass",0);

            // 查询是否完成2节点
            Act act = airBlowingBaseInfoDao.getEngineer(airTaskInfo1.getFormCirculateuserMotion(),airTaskInfo1.getBaseInfoId(),"2");
            if (act == null) {
               personList.add(apply);
            }
         }else{
            vars.put("planDispatch",airTaskInfo1.getPlanDispatchLoginName());
            vars.put("pass",1);
            personList.add(airTaskInfo1.getPlanDispatchLoginName());
         }

//
      }else if("form_circulate_motion".equals(taskDefKey)){  //2节点id
//       String apply=airTaskInfo1.getCreateBy().getLoginName();
         if("0".equals(airTaskInfo.getFormType())){
            String apply=airTaskInfo1.getCreateBy().getLoginName();
            vars.put("apply",apply);
            vars.put("pass",0);

            // 查询1节点是否完成
            Act act = airBlowingBaseInfoDao.getEngineer(airTaskInfo1.getFormCirculateuserCylinder(),airTaskInfo1.getBaseInfoId(),"1");
            if (act == null) {
               personList.add(apply);
            }
         }else {
            vars.put("planDispatch",airTaskInfo1.getPlanDispatchLoginName());
            vars.put("pass",1);
            personList.add(airTaskInfo1.getPlanDispatchLoginName());
         }


//       personList.add(apply);
      }else if("form_sign".equals(taskDefKey)){  //3节点id
         if(null != airTaskInfo.getFormCirculateuserCylinder() && !airTaskInfo.getFormCirculateuserCylinder().equals("")) {
            vars.put("formCirculateuserCylinder",airTaskInfo.getFormCirculateuserCylinder());
            vars.put("formCirculateuserMotion",airTaskInfo.getFormCirculateuserMotion());
            vars.put("pass",1);
            personList.add(airTaskInfo.getFormCirculateuserCylinder());
         }else{
            vars.put("pass",0);
            vars.put("formAudit",airTaskInfo1.getAuditLoginName());
            personList.add(airTaskInfo1.getAuditLoginName());
         }
         if("avl".equals(airTaskInfo.getSubmitType())){
            comment = comment+"(使用)";
            airTaskInfo.getAct().setComment(comment);
         }
      }else if("form_audit".equals(taskDefKey)){ 
         if("yes".equals(airTaskInfo.getAct().getFlag())){
            if(StringUtils.isNotEmpty(airTaskInfo1.getOtherCounterSign())) {
               //表单会签处理人
               List<String> loginlist = Lists.newArrayList();
               loginlist.add(airTaskInfo1.getOtherCounterSign());
               vars.put("pass",1);  
               vars.put("person_list",loginlist);
               personList.add(airTaskInfo1.getOtherCounterSign());
            }else {
               vars.put("pass",2);
               vars.put("planDispatch",airTaskInfo1.getPlanDispatchLoginName());  
               personList.add(airTaskInfo1.getPlanDispatchLoginName());
            }
         }else if("no".equals(airTaskInfo.getAct().getFlag())){
            vars.put("pass",0);
            String apply=airTaskInfo1.getCreateBy().getLoginName();
            vars.put("apply",apply);
            personList.add(apply);
         }
      }else if("form_counter_sign".equals(taskDefKey)) {                        
         vars.put("planDispatch",airTaskInfo1.getPlanDispatchLoginName());  //
         personList.add(airTaskInfo1.getPlanDispatchLoginName());
         //多人处理同一节点用此方法
         actTaskService.procParam(airTaskInfo.getAct().getTaskId(), vars,"signCount");
      }
      else if("plan_dispatch".equals(taskDefKey)){   //试
         vars.put("technicianNew",airTaskInfo1.getTestTechnicianLoginName());
         personList.add(airTaskInfo1.getTestTechnicianLoginName());
      }else if("technician_new".equals(taskDefKey)) {    //
         if(airTaskInfo.getFormCirculateuser() == null || airTaskInfo.getFormCirculateuser().equals("")){
            vars.put("pass",0);
            vars.put("testSponsor", airTaskInfo1.getTestLoginName());
            personList.add(airTaskInfo1.getTestLoginName());
         }else {
            vars.put("pass",1);
            vars.put("cancel",airTaskInfo.getFormCirculateuser());
            personList.add(airTaskInfo.getFormCirculateuser());
         }
      }else if("cancel".equals(taskDefKey)){
         String baseInfoId = airTaskInfoDao.get(airTaskInfo.getId()).getBaseInfoId();
         AirBlowingBaseInfo baseInfo = airBlowingBaseInfoDao.get(baseInfoId);
         // 发送邮件
         // 试验发起人
         if("yes".equals(airTaskInfo.getAct().getFlag())) {
            vars.put("pass", 0);


            airTaskInfo.setFormState(TestTaskInfo.FORM_STATE_04);
            airTaskInfo.setTestStage(TestTaskInfo.TEST_FINISH);
            airTaskInfoDao.updateTestStageAndFormState(airTaskInfo);
         }else{
            vars.put("pass", 1);
            vars.put("technicianNew",airTaskInfo1.getTestTechnicianLoginName());
         }
      }else if("test_sponsor".equals(taskDefKey) && Integer.valueOf(Integer.valueOf(airTaskInfo1.getProcessDefinitionId().substring(airTaskInfo1.getProcessDefinitionId().indexOf(":")+1,airTaskInfo1.getProcessDefinitionId().indexOf(":",airTaskInfo1.getProcessDefinitionId().indexOf(":")+1))))>3){//流程有改过升版可以采用这种方式使代码兼容已发起的旧流程
         //4版本之后才有归档环节
         String collector=airTaskInfo1.getCreateBy().getLoginName();
         vars.put("collector",collector);
      }else if("collect_files".equals(taskDefKey) || ("test_sponsor".equals(taskDefKey) && Integer.valueOf(airTaskInfo1.getProcessDefinitionId().substring(airTaskInfo1.getProcessDefinitionId().indexOf(":")+1,airTaskInfo1.getProcessDefinitionId().indexOf(":",airTaskInfo1.getProcessDefinitionId().indexOf(":")+1)))<4)){   //归档
         //4版本及之后才有归档环节进行如下操作,4版本之前在试验数据审核环节进行如下操作
         String baseInfoId = airTaskInfoDao.get(airTaskInfo.getId()).getBaseInfoId();
         AirBlowingBaseInfo baseInfo = airBlowingBaseInfoDao.get(baseInfoId);
         vars.put("signCount",0);
         AirBlowingTestResult airBlowingTestResult = new AirBlowingTestResult();
         airBlowingTestResult.setProcessId(airTaskInfo.getProcInsId());
         List<AirBlowingTestResult> testResultList = airBlowingTestResultDao.findGroupList(airBlowingTestResult);


        

         if("yes".equals(airTaskInfo.getAct().getFlag())){
            vars.put("pass",1);
            }
         }else if("no".equals(airTaskInfo.getAct().getFlag())){
            vars.put("pass",0);
            String apply=airTaskInfo1.getCreateBy().getLoginName();
            vars.put("apply",apply);
            personList.add(apply);

            // 发送邮件
            MailUtil.testSchemeSendEmail(airTaskInfo1.getCreateBy().getLoginName(), "审核驳回提醒", "流程:" + "\"" + baseInfo.getTaskName() + "\"" + "审核阶段被驳回");

            // 试验负责人 testTechnicianLoginName
            MailUtil.testSchemeSendEmail(airTaskInfo1.getTestTechnicianLoginName(), "驳回提醒", "流程:" + "\"" + baseInfo.getTaskName() + "\"" + "审核阶段被驳回");

            // 试验计划员 planDispatchLoginName
            MailUtil.testSchemeSendEmail(airTaskInfo1.getPlanDispatchLoginName(), "审核驳回提醒", "流程:" + "\"" + baseInfo.getTaskName() + "\"" + "审核阶段被驳回");

         }else if("sign".equals(airTaskInfo.getAct().getFlag())){//5版本之后才有节
            vars.put("pass",2);
            String[] users = airTaskInfo.getExceptionSigner().split(",");
            List<String> userList = Arrays.asList(users);
            vars.put("user_list",userList);
         }
      }else if("exception_sign".equals(taskDefKey)){//5版本之后才有

         vars.put("pass", "yes".equals(airTaskInfo.getAct().getFlag())? "1" : "0");
         actTaskService.procParam(airTaskInfo.getAct().getTaskId(), vars,"signCount");
      }

      actTaskService.complete(airTaskInfo.getAct().getTaskId(),airTaskInfo.getAct().getProcInsId(),airTaskInfo.getAct().getComment(),"", vars);
      
   }
  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
坚持学习WF(1):从HelloWorld开始 本文主要通过实现了一个可以接受参数的HelloWorld程序来了解WF。 坚持学习WF(2):WF创作模式和设计时工具 坚持学习WF(3):WF框架概览 2.3两篇主要全面的阐述了WF框架和Visual Studio对开发WF的一些设计时的工具。 坚持学习WF(4):活动(Activity)和依赖属性(DependencyProperty) 坚持学习WF(5):自定义活动(CustomActivity) 4.5两篇对主要对活动(Actibity)的介绍和依赖属性(DependencyObject)和DependencyProperty事件的使用。 坚持学习WF(6):开发可复用的宿主程序 主要实现两个类来对WorkflowInstance和WorkflowRuntime进行简单的封装。 坚持学习WF(7):流程控制(Flow Control) 主要说了WF中和流程相关的活动,主要包括以下这些活动:IfElseActivity,WhileActivity,ParallelActivity,ReplicatorActivity,ConditionedActivityGroup,InvokeWorkflowActivity,TerminateActivity,SuspendActivity等。 坚持学习WF(8):本地服务之调用外部方法 坚持学习WF(9):本地服务之事件处理 工作流能够使用方法和事件通过消息与宿主程序交互。 事件用于将数据发送到工作流,而工作流使用方法将数据发送到主机应用程序,8.9两篇主要说了本地服务如何调用外部方法和接收事件。 坚持学习WF(10):在工作流使用关联 当工作流实例在本地服务接口上侦听相同事件的不同实例时,就无法确定该响应哪个事件。如何解决这个问题呢,我们就需要在工作流使用关联。 坚持学习WF(11):工作流通信与队列 WF 提供的通信模型是构建于队列系统的基础之上,我们可以使用自定义活动来注册以接收关于队列的消息,而宿主应用程序中的服务则发送关于队列的消息。自定义活动可以使用此模型来处理外部事件,也可以传递异步活动执行的完成。这样,您的活动可以先执行到某一点,然后等待激发因素的到来以便继续执行。 坚持学习WF(12):使用EventHandlingScopeActivity活动 EventHandlingScopeActivity活动包含一个主线子活动和一组事件处理活动(EventHandlersActivity),它的主线子活动中只能包含一个子活动。它会执行其主子活动比如SequenceActivity。 同时,可能会执行每个EventDrivenActivity,也可能不执行它们,这取决于在SequenceActivity 活动执行时是否发生了它们的事件,当主线活动执行完了整个EventHandlingScopeActivity活动也就结束了。 坚持学习WF(13):WF中的持久化服务 主要介绍了如何使用WF中提供的SqlWorkflowPersistenceService来进行持久化存储。 坚持学习WF(14):自定义持久化服务 我们除了使用WF提供的SqlWorkflowPersistenceService外,还可以自定义持久化服务。因为有的时候你可能不想使用Sql Server数据库,我们就可以通过自定义持久化服务来使用其他的数据库,文件等来进行持久化存储。 坚持学习WF(15):状态机工作流 本文主要介绍WF中状态机工作流的基础知识,状态机工作流和顺序型工作流不同。顺序型工作流一般是比较固定的,可预测的,和系统交互的时候比较多。而状态机工作流一般是不可预测,和人的交互会比较多一些,一般有回退流程的时候使用状态机工作流会比较好一点,如何正确的选择顺序型工作流还是状态机工作流是十分重要的。 坚持学习WF(16):WF中的事务 在关系型数据库中支持事务已经有10几年了,事务用来解决数据的完整性、一致性等等问题。在WF中提供了TransactionScopeActivity活动用来支持事务,当该活动执行时一个System.Transactions.Transaction实例就被创建了,如果TransactionScopeActivity中的子活动有一个有异常,就会执行回滚操作。 坚持学习WF(17):WF中的补偿 事务是你在做一组更新时要不成功,要不失败,不可能只部分更新。事务最经典的使用场合就是在关系型数据库中。补偿是取消之前已经成功的操作,在我们的工作流中我们可能完成一项任务有很多活动组成,比如我们的活动都使用了TransactionScopeActivity,我们在之后发现错误了,想要取消之前成功的操作,这个和事务就没有关系了,因为事务已经成功了。这个时候我们就可以使用补偿。 坚持学习WF(18):使用IPendingWork接口 WF会定期在各个持久性点(Persistence Point)检查并将工作流实例保存到持久化存储中,这样如果工作流出现错误或是异常终止时相关的信息就会被存储,下次加载工作流实例时就会从此做为开始点。这个主要是针对工作内置的服务。工作流的外部服务使用工作批次来保留状态信息。 这些服务对其工作项进行批处理并共享与工作流的事务相同的事务。 如果工作流尚未提交事务,则服务仍可以在持久点期间对某些工作项进行批处理。WF提供 IWorkBatch 和 IPendingWork 以帮助服务和工作流实例保留状态信息。 坚持学习WF(19):工作流线程 WF中提供了很多内置的服务,其中工作流计划服务是用来管理工作流实例线程的。默认情况下WF会自动使用DefaultWorkflowSchedulerService服务,我们还可以手动去加载ManualWorkflowSchedulerService服务。本文利用MSDN中的一个例子来说明工作流中的线程以及如何使用DefaultWorkflowSchedulerService和ManualWorkflowSchedulerService服务。 坚持学习WF(20):规则引擎中的活动条件 坚持学习WF(21):规则引擎中的RuleSet 坚持学习WF(22):跟踪规则 坚持学习WF(23):以代码的方式构造和执行RuleSet WF提供了非常灵活,强大和简单易懂的规则引擎。这几篇文章介绍了WF中规则引擎的相关知识。 坚持学习WF(24):WF中的异常处理 坚持学习WF(25):取消容器(CancellationHandlerActivity) 说明了WF如果捕获和处理异常,并介绍了CancellationHandlerActivity活动的基本使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值