BOS項(xiàng)目第10天

10 BOS項(xiàng)目第10天

今天繼續(xù)學(xué)習(xí)工作流activity,流程變量

10.1 請(qǐng)假流程存在的問題

  • 缺少請(qǐng)假原因和請(qǐng)假天數(shù),后期可能還會(huì)有其它數(shù)據(jù)要補(bǔ)充
  • activiti把這些數(shù)據(jù)稱為流程變量股毫,內(nèi)部提供了一張act_ru_variable 表來存這些數(shù)據(jù)


    image.png

10.2 設(shè)置流程變量的方式

  • 重新創(chuàng)建一個(gè)Java項(xiàng)目和數(shù)據(jù)庫(kù),這次用報(bào)銷流程講解


    image.png

10.2.1 第一種:?jiǎn)?dòng)流程實(shí)例時(shí)設(shè)置流程變量

@Test
    public void test1(){
        //2.獲取部署構(gòu)建器對(duì)象
        DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();

        //3.添加流程資源
        deploymentBuilder.addClasspathResource("bxlc.bpmn");
        deploymentBuilder.addClasspathResource("bxlc.jpg");

        //4.部署
        Deployment deployment = deploymentBuilder.deploy();
        System.out.println(deployment.getId());
    }

    /**
     * 啟動(dòng)流程實(shí)例時(shí)設(shè)置流程變量
     */
    @Test
    public void test2(){
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("bxyy", "成都出差機(jī)票");
        varibles.put("bxje", "980");
        processEngine.getRuntimeService().startProcessInstanceByKey("bxlc", varibles);
    }

10.2.2 第二種:辦理任務(wù)時(shí)設(shè)置流程變量

/**
     * 審核任務(wù)時(shí)設(shè)置流程變量
     */
    @Test
    public void test3(){
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("bxyy", "成都出差動(dòng)車票");
        varibles.put("bxje", "260.00");
        processEngine.getTaskService().complete("1106", varibles);
    }

10.2.3 使用RuntimeService的set方法設(shè)置流程變量

/**
     * 使用RuntimeService的set方法設(shè)置流程變量
     */
    @Test
    public void test4(){
        String processInstanceId = "1101";
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("審核狀態(tài)", "同意");
        processEngine.getRuntimeService().setVariables(processInstanceId, varibles);
    }

10.2.4 用TaskService的set方法設(shè)置

/**
     * 用TaskService的set方法設(shè)置
     */
    @Test
    public void test5(){
        String taskId = "1202";//任務(wù)id
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("審核狀態(tài)", "不同意");
        processEngine.getTaskService().setVariables(taskId, varibles);
    }

10.2.5 如果設(shè)置的是自定義的類型苍凛,需要實(shí)現(xiàn)序列化接口

@Test
    public void test5(){
        String taskId = "1202";//任務(wù)id
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("審核狀態(tài)", "不同意");
        varibles.put("user", new User("kdj", "123456"));
        processEngine.getTaskService().setVariables(taskId, varibles);
    }

10.3 讀取流程變量的方式

10.3.1 方式一:使用RuntimeService的get方法獲取

@Test
    public void test6() {
        //用getRuntimeService的get方法獲取流程變量
        String processInstanceId = "1101";
        User user = (User) processEngine.getRuntimeService().getVariable(processInstanceId, "user");
        System.out.println(user);

        String state = (String) processEngine.getRuntimeService().getVariable(processInstanceId, "審核狀態(tài)");
        System.out.println(state);
    }

10.3.2 使用TaskService的get方法獲取

@Test
    public void test7() {
        //用TaskService的get方法獲取流程變量
        String taskId = "1202";
        User user = (User) processEngine.getTaskService().getVariable(taskId, "user");
        System.out.println(user);

        String state = (String) processEngine.getTaskService().getVariable(taskId, "審核狀態(tài)");
        System.out.println(state);
    }

10.4 動(dòng)態(tài)設(shè)置任務(wù)的候選人

  • 第一步:在啟動(dòng)流程實(shí)現(xiàn)時(shí),需要添加一個(gè)表達(dá)式里的變量值
@Test
    public void test2() {
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("bxyy", "成都出差機(jī)票");
        varibles.put("bxje", "2800");
        varibles.put("employeeName", "lisi");
        processEngine.getRuntimeService().startProcessInstanceByKey("bxlc", varibles);
    }
  • 在任務(wù)的Assignee寫表達(dá)式


    image.png

10.5 組任務(wù)操作

10.5.1 候選人組任務(wù)(了解)

  • 第一步:給任務(wù)添加多個(gè)用戶


    image.png
  • 第二步:重新部署流程和啟動(dòng)流程實(shí)現(xiàn)

@Test
    public void test1() {
        //2.獲取部署構(gòu)建器對(duì)象
        DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();

        //3.添加流程資源
        deploymentBuilder.addClasspathResource("bxlc.bpmn");
        deploymentBuilder.addClasspathResource("bxlc.jpg");

        //4.部署
        Deployment deployment = deploymentBuilder.deploy();
        System.out.println(deployment.getId());
    }

    /**
     * 啟動(dòng)流程實(shí)例時(shí)設(shè)置流程變量
     */
    @Test
    public void test2() {
        HashMap<String, Object> varibles = new HashMap<>();
        varibles.put("bxyy", "成都出差機(jī)票");
        varibles.put("bxje", "2800");
        varibles.put("employeeName", "lisi");
        processEngine.getRuntimeService().startProcessInstanceByKey("bxlc", varibles);
    }
  • 第三步:辦理第一個(gè)流程任務(wù)
@Test
    public void test3() {
        //李四提交申請(qǐng)
        processEngine.getTaskService().complete("107");
    }
  • 第四步:根據(jù)用戶id查詢?nèi)蝿?wù)
@Test
    public void test4() {
        //查找財(cái)務(wù)人員要審核任務(wù)
        TaskQuery tq = processEngine.getTaskService().createTaskQuery();

        //設(shè)置候選人名稱
        tq.taskCandidateUser("kdj01");

        //打印任務(wù)id,打印名稱
        for (Task task : tq.list()) {
            System.out.println(task.getId() + ":" + task.getName());
        }
    }
  • 第五步:拾取任務(wù)
@Test
    public void test4() {
        //查找財(cái)務(wù)人員要審核任務(wù)
        TaskQuery tq = processEngine.getTaskService().createTaskQuery();

        //設(shè)置候選人名稱
        String user = "kdj01";
        tq.taskCandidateUser(user);

        //打印任務(wù)id,打印名稱
        for (Task task : tq.list()) {
            System.out.println(task.getId() + ":" + task.getName());

            //拾取任務(wù)
            processEngine.getTaskService().claim(task.getId(), user);
        }
    }

10.5.2 候選組組任務(wù)(重點(diǎn))

  • 第一步:設(shè)置一個(gè)財(cái)務(wù)分組id


    image.png
  • 第二步:重新部署流程并啟動(dòng)流程實(shí)例然后complete提交申請(qǐng)

  • 第三步:添加組


    image.png
  • 第四步:添加用戶


    image.png
  • 第五步:建立用戶和組的關(guān)系


    image.png
  • 第六步:根據(jù)用戶id或者組查詢?nèi)蝿?wù)

    • 注意:查詢?nèi)蝿?wù)時(shí),要先啟動(dòng)流程實(shí)現(xiàn)并輸?shù)谝粋€(gè)任務(wù)
@Test
        public void testProcessInstance(){
            //啟動(dòng)流程實(shí)例:
            Map<String,Object> variables = new HashMap<String,Object>();
            variables.put("bxyy", "南京出差機(jī)機(jī)票");
            variables.put("bxje", "890");
            variables.put("employeeName", "小李");
            pe.getRuntimeService().startProcessInstanceByKey("bxlc", variables);
        }
        
        @Test
        public void testComplete(){
            //處理第一個(gè)任務(wù)
            pe.getTaskService().complete("2307");
        }
        @Test
        public void test5(){
            //查詢組任務(wù)
            TaskQuery tq = pe.getTaskService().createTaskQuery();
            String userId = "1";
            //tq.taskCandidateUser(userId);
            tq.taskCandidateGroup("財(cái)務(wù)組");
            List<Task> tasks = tq.list();
            for(Task t:tasks){
                System.out.println(t.getId());
            }
        }
  • 第七步:拾起任務(wù)
    pe.getTaskService().claim("2402", "1");

10.6 排他網(wǎng)關(guān)

10.6.1 排他網(wǎng)關(guān)流程圖

image.png

10.6.2 測(cè)試網(wǎng)關(guān)

  • 在開啟流程實(shí)例時(shí)鸠蚪,必需設(shè)置流量變量qjts
public class GateWayTest {
    //1.獲取流程引擎
            ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();
                    
            @Test
            public void test1(){
                
                //2.獲取部署構(gòu)建器對(duì)象
                DeploymentBuilder db = pe.getRepositoryService().createDeployment();
                
                //3.添加流程資源
                db.addClasspathResource("com/huaizhi/activiti/gateway/qjlc.bpmn");
                db.addClasspathResource("com/huaizhi/activiti/gateway/qjlc.png");
            
                //4.部署
                Deployment deployment = db.deploy();
                System.out.println(deployment.getId());
            }
            
            @Test
            public void test2(){
                Map<String,Object> variables = new HashMap<String,Object>();
                variables.put("qjyy", "感冒..");
                variables.put("qjts",5);
                pe.getRuntimeService().startProcessInstanceByKey("qjlc", variables);
                
            }
            @Test
            public void test3(){
                String taskId = "606";
                pe.getTaskService().complete(taskId);
                
            }
}

10.7 activiti與spring整合

10.7.1 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd
                        http://www.springframework.org/schema/aop
                        http://www.springframework.org/schema/aop/spring-aop.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 配置數(shù)據(jù)源  -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url"  value="jdbc:mysql:///activiti_day1"/>
        <property name="username"  value="root"/>
        <property name="password"  value="root"/>
    </bean>

    <!--  配置事務(wù)管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 流程引擎配置對(duì)象 -->
    <bean id="processEngineConfiguration"
          class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="dataSource" ref="dataSource"/>
        <property name="transactionManager" ref="transactionManager"/>
    </bean>

    <!-- 使用工廠創(chuàng)建流程引擎對(duì)象 -->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>
</beans>

10.7.2 單元測(cè)試

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.repository.ProcessDefinition;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class Main5 {

    @Test
    public void test1() {
        //1.創(chuàng)建spring工廠
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

        //2.獲取bean
        ProcessEngine pe = (ProcessEngine) ac.getBean("processEngine");

        List<ProcessDefinition> list = pe.getRepositoryService().createProcessDefinitionQuery().list();

        //有流程定義打印,代表配置成功
        for(ProcessDefinition pd : list){
            System.out.println(pd.getKey());
        }
    }
}

10.8 Bos項(xiàng)目集成activiti

10.8.1 第一步:在Bos數(shù)據(jù)庫(kù)添加activiti所需要的表

  • 之前三個(gè)sql文件,已經(jīng)導(dǎo)入了

10.8.2 第二步:將activiti與spring的整合轉(zhuǎn)移到Bos項(xiàng)目中

  • 導(dǎo)入jar包到項(xiàng)目:使用spring3.2以上版本妖谴,不需要添加spring-asm.jar

  • spring中配置processengin

<!-- 流程引擎配置對(duì)象 -->
    <bean id="processEngineConfiguration"
         class="org.activiti.spring.SpringProcessEngineConfiguration">
         <property name="dataSource" ref="dataSource"/>
         <property name="transactionManager" ref="transactionManager"/>
    </bean>

    <!-- 使用工廠創(chuàng)建流程引擎對(duì)象 -->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>
  • 再配置activiti的各種service
<!-- 注冊(cè)Service -->
    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
  • 測(cè)試下是否能獲取到流程定義
@Autowired
    private RepositoryService rs;
    public String login(){
        logger.info(getModel());

        System.out.println(rs); //如果有值,證明activiti的配置木有問題

10.9 流程定義管理模型

10.9.1 修改系統(tǒng)管理的菜單數(shù)據(jù)

  • 在admin.json 添加兩行數(shù)據(jù)
  • 注意:系統(tǒng)管理的數(shù)據(jù)是從json中獲取,不是從數(shù)據(jù)庫(kù)
    { "id":"1004", "pId":"100", "name":"流程定義管理", "page":"processDefinitionAction_list.action"},
    { "id":"1005", "pId":"100", "name":"查看正在運(yùn)行的流程實(shí)例", "page":"processInstanceAction_list.action"}

10.9.2 查看流程定義

  • 創(chuàng)建ProcessDefinitionAction,完成流程定義列表展現(xiàn)

10.9.3 部署流程定義

//發(fā)布一個(gè)流程
    public String deploy() throws FileNotFoundException {

        //1.獲取部署的對(duì)象
        DeploymentBuilder builder = rs.createDeployment();

        //2.builder 添加壓縮包的輸入流
        builder.addZipInputStream(new ZipInputStream(new FileInputStream(zipFile)));

        builder.deploy();

        //部署完后回到list頁(yè)面
        return "list";
    }

10.9.4 查看流程定義圖

  • 第一步:修改jsp頁(yè)面
<td>
    <a onclick="showPng('${id}')" class="easyui-linkbutton" data-options="iconCls:'icon-search'">查看流程圖</a>
</td>
<script>
    function showPng(id) {
        //alert(id);
        //顯示流程圖
        window.open("${pageContext.request.contextPath}/processDefinitionAction_viewpng.action?id=" + id);
    }
</script>
  • 第二步:Action
public String viewpng(){
        //返回一張圖片給客戶端
        //1.根據(jù)流程id獲取圖片
        InputStream imgIS = rs.getProcessDiagram(id);

        //2.把imgIS放在值棧
        ActionContext.getContext().getValueStack().set("imgIS", imgIS);
        return "viewpng";
}
  • 第三步:Struts
<action name="processDefinitionAction_*" class="com.kdj.bos.web.action.ProcessDefinitionAction" method="{1}">
    <result name="list">/WEB-INF/pages/workflow/processdefinition_list.jsp</result>

    <!--告訴客戶端返回流文件-->
    <result name="viewpng" type="stream">
        <param name="contentType">image/png</param>
        <param name="inputName">imgIS</param>
    </result>
</action>

10.9.5 刪除流程定義

  • 效果


    image.png
  • 第一步:添加刪除的js代碼

function del(id) {
    $.messager.confirm("提示","是否要?jiǎng)h除?", function (r) {
        if (r){
            var url = "${pageContext.request.contextPath}/processDefinitionAction_del.action";
            $.post(url, {id:id}, function (data) {
                if (data == "success") {
                    $.messager.alert("提示", "刪除成功", "info", function () {
                        location.href = "${pageContext.request.contextPath}/processDefinitionAction_list.action"
                    });
                } else{
                    $.messager.alert("提示", "刪除失敗", "error");
                }
            });
        }
    });
}
  • 第二步:Action代碼
public void del() throws IOException {
    //1.先根據(jù)流程定義的id查找部署id
    ProcessDefinitionQuery query = rs.createProcessDefinitionQuery();
    query.processDefinitionId(id);
    ProcessDefinition pd = query.singleResult();

    String deploymentId = pd.getDeploymentId();
    rs.deleteDeployment(deploymentId);
    ServletActionContext.getResponse().getWriter().write("success");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末判沟,一起剝皮案震驚了整個(gè)濱河市挪哄,隨后出現(xiàn)的幾起案子琉闪,更是在濱河造成了極大的恐慌颠毙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛀蜜,死亡現(xiàn)場(chǎng)離奇詭異刻两,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)滴某,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門磅摹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霎奢,你說我怎么就攤上這事户誓。” “怎么了幕侠?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵帝美,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我晤硕,道長(zhǎng)庇忌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上初茶,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好爽待,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布何什。 她就那樣靜靜地躺著,像睡著了一般幕袱。 火紅的嫁衣襯著肌膚如雪涯捻。 梳的紋絲不亂的頭發(fā)上凌外,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天疮薇,我揣著相機(jī)與錄音,去河邊找鬼。 笑死掠抬,一個(gè)胖子當(dāng)著我的面吹牛贬蛙,可吹牛的內(nèi)容都是我干的氛堕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼乍狐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了贝攒?” 一聲冷哼從身側(cè)響起荒适,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肌割,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡期揪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片速兔。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唧瘾,到底是詐尸還是另有隱情求豫,我是刑警寧澤蚤告,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站仍源,受9級(jí)特大地震影響心褐,放射性物質(zhì)發(fā)生泄漏笼踩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一匾旭、第九天 我趴在偏房一處隱蔽的房頂上張望伪窖。 院中可真熱鬧,春花似錦拜银、人聲如沸溢豆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至犹赖,卻和暖如春队他,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峻村。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工麸折, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粘昨。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓垢啼,卻偏偏與公主長(zhǎng)得像窜锯,于是被迫代替她去往敵國(guó)和親芭析。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容