アクティビティの作成と実行

1.xml構成の作成

   (1)依存パッケージをインポートする

         

        

(2)設定ファイルを書き込む

      

<bean id="dataSource1" parent="baseDataSource">
        <property name="driverClass" value="${jdbc.driverClass}" />
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
    
    <!-- 配置数据源 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <property name="targetDataSource" ref="dataSource1" />
    </bean>

      <!-- 配置一个流程引擎工程bean,用于创建流程引擎对象 自动创建23张表 -->

       <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="dataSource" ref="dataSource" />
    </bean>

<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>

<bean id="repositoryService" factory-bean="processEngine"
        factory-method="getRepositoryService" />
    <bean id="runtimeService" factory-bean="processEngine"
        factory-method="getRuntimeService" />
    <!-- <bean id="formService" factory-bean="processEngine" factory-method="getFormService"/> -->
    <bean id="identityService" factory-bean="processEngine"
        factory-method="getIdentityService" />
    <bean id="taskService" factory-bean="processEngine"
        factory-method="getTaskService" />
    <bean id="historyService" factory-bean="processEngine"
        factory-method="getHistoryService" />
    <bean id="managementService" factory-bean="processEngine"
        factory-method="getManagementService" />

(3)実装

      スタートアッププロジェクトは、一致するファイルをチェックし、独自の23個のテーブルを生成します

2.プロセスコード

(1)起動プロセス

/**
     * 启动流程
     * @param processDefKey 流程定义Key
     * @param userId        当前登陆用户
     * @param businessId    业务数据的主键ID
     * @param parameters    流程级别的变量Map(此Map种的变量作用于为整个流程的生命周期)
     * @return                 流程实例ID
     * @throws Exception
     

影响的表

        act_hi_actinst     已完成的活动信息
         act_hi_identitylink   参与者信息
         act_hi_procinst   流程实例
         act_hi_taskinst   任务实例
         act_ru_execution   执行表
         act_ru_identitylink   参与者信息
         act_ru_task  任务
*/

public String startWorkFlow(String processDefKey,String userId,String businessId,Map<String, Object> parameters) throws Exception {
        //设置流程发起用户信息     当流程启动之后可以到表ACT_HI_PROCINST中查看字段START_USER_ID_的值来验证是否生效
        identityService.setAuthenticatedUserId(userId);
        if(null == parameters) parameters = new HashMap<String,Object>();
        //设置默认回退标志
        parameters.put("isBack", false);
        //启动流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefKey, businessId, parameters);
        //自动完成第一个任务
        Task task = taskService.createTaskQuery().processDefinitionKey(processDefKey).taskCandidateUser(userId).processInstanceId(processInstance.getId()).singleResult();

       //完成任务
        completeTask(task.getId(),userId,"","1",parameters);
        return processInstance.getId();
    }



/**
     * 完成任务
     * @param taskId        任务ID
     * @param userId        用户ID
     * @param comment        审批意见
     * @param examineResult    审批结果
     * @param parameters    变量Map
     */
    public void completeTask(String taskId,String userId,String comment,String examineResult,Map<String, Object> parameters) throws Exception{
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        //判断当前任务是否有代理人
        String assignee = task.getAssignee();
        //如果代理人是空,则有可能是因为此任务还处于待认领状态,将此任务的代理人设置为当前登陆人
        if(StringUtils.isEmpty(assignee)){
            taskService.claim(taskId, userId);
        }
        //添加此任务的审批意见
        taskService.addComment(task.getId(), task.getProcessInstanceId(), StringUtils.isEmpty(comment) ? "无" : comment);
        if(null == parameters) parameters = new HashMap<String,Object>();
        //设置审批结果及回退标志
        if("0".equals(examineResult)){
            parameters.put("isBack", true);
            taskService.setVariableLocal(task.getId(), "examineResult", "退回");
        }else if("1".equals(examineResult)){
            parameters.put("isBack", false);
            taskService.setVariableLocal(task.getId(), "examineResult", "通过");
        }
        
        //设置是否涉密字段设置
        if(parameters.containsKey("isSecret") && parameters.get("isSecret") != null){
            taskService.setVariableLocal(task.getId(), "isSecret", parameters.get("isSecret").toString());
        }
        
        //完成任务
        taskService.complete(taskId, parameters);
    }

 

(2)二次承認


 

/**
     * 根据流程实例ID查询历史流程实例
     * @param pi        流程实例ID
     * @return
     * @throws Exception
     */
    public HistoricProcessInstance queryHistoricProcessInstanceByPI(String pi) throws Exception {
        return historyService.createHistoricProcessInstanceQuery().processInstanceId(pi).singleResult();
    }



/**
     * 完成任务
     * @param taskId        任务ID
     * @param comment        审批意见
     * @param examineResult    审批结果
     * @throws Exception
     */
    public void doCompleteTask(String taskId,String comment,String examineResult,String pi,String zjrVar,String nextVarName) throws Exception {
        // 获取是否涉密字段
        String isSecret = CommonUtil.getRequest().getParameter("isSecret");
        
        /**
         * 当审批结果为通过\并且下一步审批人不为空时,设置下一个审批人
         */
        Map<String,Object> map = new HashMap<String,Object>();
        if("1".equals(examineResult) && StringUtils.isNotEmpty(nextVarName)){
            map.put(nextVarName, zjrVar);
        }
        
        // 保存此处理步骤的是否涉密字段值
        map.put("isSecret", isSecret);
        
        ///
        workFlowCoreService.completeTask(taskId, CommonUtil.getUserFromSession().getPkSysUsersId(), comment, examineResult, map);
        HistoricProcessInstance processInstance = workFlowCoreService.queryHistoricProcessInstanceByPI(pi);//查询历史流程实例
        String businessKey = processInstance.getBusinessKey();//获取流程ID
        BasDocument basDocument = this.queryByID(businessKey);
        if(processInstance.getEndTime() != null){//如果历史流程有结束则整体流程结束,之后修改业务表
            basDocument.setFlowstate("已办结");
        }else{
            if("0".equals(examineResult) && "审批中".equals(basDocument.getFlowstate())){
                basDocument.setFlowstate("被退回");
            }else if("1".equals(examineResult) && "被退回".equals(basDocument.getFlowstate())){
                basDocument.setFlowstate("审批中");
            }
        }
        this.edit(basDocument);
        
        //保存附件
        basDocumentAttachmentService.doSaveAttachment(basDocument.getId(),"1");
    }

3.まとめ

(1)Activitiには2つの構成方法があります。1つはコードタイプ、もう1つはxml構成タイプで、一般的な構成タイプの方が使いやすく便利です。

(2)開始

   a。xmlを構成した後、プロジェクトを開始すると、23個のテーブルが自動的に作成されます

   b。プロセスイニシエーターIDを保存します

identityService.setAuthenticatedUserId(userId);

   c。起動プロセス

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefKey, businessId, parameters);

   d。最初のタスクを自動的に完了する

Task task = taskService.createTaskQuery().processDefinitionKey(processDefKey).taskCandidateUser(userId).processInstanceId(processInstance.getId()).singleResult();

   e。2番目のタスクから完了タスクメソッドを呼び出します

completeTask(task.getId(),userId,"","1",parameters);

      承認コンテンツを追加する

 taskService.addComment(task.getId(), task.getProcessInstanceId(), StringUtils.isEmpty(comment) ? "无" : comment);

      承認結果を追加するか、返品してください

taskService.setVariableLocal(task.getId(), "examineResult", "退回/通过");

      任務完了

taskService.complete(taskId, parameters);    ------发起审批结束

   f。第2レベルの承認については、前の段落で承認者を指定する必要があります。承認者がいない場合、プロセスは終了します。      

执行任务----workFlowCoreService.completeTask(taskId, CommonUtil.getUserFromSession().getPkSysUsersId(), comment, examineResult, map);
      查看历史流程实例,获取该流程是否有结束时间

       HistoricProcessInstance processInstance = workFlowCoreService.queryHistoricProcessInstanceByPI(pi);//查询历史流程实例
        String businessKey = processInstance.getBusinessKey();//获取流程ID
        BasDocument basDocument = this.queryByID(businessKey);
        if(processInstance.getEndTime() != null){//如果历史流程有结束则整体流程结束,之后修改业务表

 

おすすめ

転載: blog.csdn.net/qq_32923295/article/details/114576270