公司采購 流程flowable例子


業務描述:
1. 公司采購,因為辦公用品價格高低的問題,需要分級審批,各級的審批資金的高低不一樣,高於 500 塊錢需要總經理審批!
1. 申請流程:
1. 申請人起草填寫申請單(申請辦公用品【數據庫自帶價格】、申請理由、使用人),保存后可立即提交申請;
1. 申請人提交審批,發起流程;
1. 部門經理審批;
1. 流程自動處理,采購金額buyCost大於 500的,自動轉到總經理審批,否則直接轉到人事部審批;
1. 如果總經理審批或者人事部審批通過,則自動轉到財務部歸檔,否則被打回到申請人處理;
1. 財務歸檔處理后,流程轉到采購部處理,采購部可以根據辦公用品是否需要采購進行控制,選擇采購辦公用品或者人事部發放辦公用品,流程轉到此兩者之一。
1. 如果申請單被打回到申請人,申請人可以再次修改后重新提交審批,也可以選擇放棄、到此流程結束。
1. 如果流程走到采購辦公用品,那么,采購部人員可以控制此流程,如果辦公用品采購回來了,那么流程轉到人事部發放辦公用品。
1. 當人事部發放辦公用品 人事部處理完過后,流程轉到領取辦公用品,申請人到人事部去領取辦公用品,流程到此結束。

    // 使用代碼創建工作流需要的23張表
    @Before
    public void createTable() {
        // 工作流引擎的全部配置
        ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration
                .createStandaloneProcessEngineConfiguration()
                .setJdbcUrl("jdbc:jtds:sqlserver://localhost:1433/msgBoard2")
                .setJdbcUsername("sa")
                .setJdbcPassword("1234")
                .setJdbcDriver("net.sourceforge.jtds.jdbc.Driver")
                .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);

        // 工作流的核心對象,ProcessEnginee對象
        processEngine = processEngineConfiguration.buildProcessEngine();
        System.out.println("-----------工作流引擎開啟----------");
    }

    /**
     * 部署流程定義
     */
    @Test
    public void deploymentProcessDefinition() {
        //創建核心引擎對象
        Deployment deployment = processEngine.getRepositoryService()
                .createDeployment()
                .name("flowable入門程序2")
                .addClasspathResource("myProcess-test.bpmn20.xml")
                .deploy();
        System.out.println("##########添加部署##########");
        System.out.println("部署ID:" + deployment.getId());
        System.out.println("部署名稱:" + deployment.getName());
        findProcessDefinition();
    }

    /**
     * 啟動流程實例
     * 使用key值啟動
     */
    @Test
    public void startProcessInstance2() {
        // 流程定義的key
        String processDefinitionKey = "myProcess-test";
        ProcessInstance pi = processEngine.getRuntimeService()// 於正在執行的流程實例和執行對象相關的Service
                .startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程實例,key對應hellworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動
        System.out.println("流程實例ID:" + pi.getId());// 流程實例ID 101
        System.out.println("流程定義ID:" + pi.getProcessDefinitionId()); // 流程定義ID HelloWorld:1:4
    }

    /**
     * 啟動流程實例
     * 使用id值啟動
     */
    @Test
    public void startProcessInstance() {
        RuntimeService runtimeService = processEngine.getRuntimeService();//表示正在執行的流程實例和執行對象

        ProcurementVO procurementVO = new ProcurementVO();
        procurementVO.setEmployee("sky");
        procurementVO.setReason("測試用例。。。。。。。。");
        List<Articles> articlesList = new ArrayList<Articles>();
        Articles articles1 = new Articles("文具", 80, 1);
        Articles articles2 = new Articles("電腦", 500, 1);
        articlesList.add(articles1);
        articlesList.add(articles2);
        procurementVO.setArticlesList(articlesList);
        double buyCost = 0;
        for (Articles articles : articlesList) {
            buyCost += (articles.getAmount() * articles.getPrice());
        }
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("procurement", procurementVO);
        variables.put("buyCost", buyCost);

        String processDefinitionId = "myProcess-test:1:105003";
        ProcessInstance processInstance =
                runtimeService.startProcessInstanceById(processDefinitionId, variables);
        System.out.println("##########流程開啟##########");
        System.out.println("流程實例ID:" + processInstance.getId());
        System.out.println("流程定義ID:" + processInstance.getProcessDefinitionId());
        findTask();
    }

    /**
     * 查詢所有的流程定義
     */
    @Test
    public void findProcessDefinition() {
        List<ProcessDefinition> list = processEngine.getRepositoryService()// 與流程定義和部署對象先相關的service
                .createProcessDefinitionQuery()// 創建一個流程定義的查詢
                /** 指定查詢條件,where條件 */
                // .deploymentId(deploymentId) //使用部署對象ID查詢
                // .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
                // .processDefinitionNameLike(processDefinitionNameLike)//使用流程定義的名稱模糊查詢

            /* 排序 */
                .orderByProcessDefinitionVersion().asc()
                // .orderByProcessDefinitionVersion().desc()

            /* 返回的結果集 */
                .list();// 返回一個集合列表,封裝流程定義
        // .singleResult();//返回惟一結果集
        // .count();//返回結果集數量
        // .listPage(firstResult, maxResults);//分頁查詢

        if (list != null && list.size() > 0) {
            for (ProcessDefinition pd : list) {
                System.out.println("流程定義ID:" + pd.getId());// 流程定義的key+版本+隨機生成數
                System.out.println("流程定義的名稱:" + pd.getName());// 對應helloworld.bpmn文件中的name屬性值
                System.out.println("流程定義的key:" + pd.getKey());// 對應helloworld.bpmn文件中的id屬性值
                System.out.println("流程定義的版本:" + pd.getVersion());// 當流程定義的key值相同的相同下,版本升級,默認1
                System.out.println("資源名稱bpmn文件:" + pd.getResourceName());
                System.out.println("資源名稱png文件:" + pd.getDiagramResourceName());
                System.out.println("部署對象ID:" + pd.getDeploymentId());
                System.out.println("是否暫停:" + pd.isSuspended());
                System.out.println("#########################################################");
            }
        } else {
            System.out.println("沒有流程正在運行。");
        }
    }

    /**
     * 獲取任務
     */
    @Test
    public void getTask() {
        // 與任務相關的service,正在執行的service
        TaskService taskService = processEngine.getTaskService();
        // 任務ID
        String taskId = "85005";

        Task task = taskService.newTask(taskId);
        System.out.println(task.getId() + "    " +
                task.getAssignee() + "    " +
                task.getName() + "    " +
                task.getProcessInstanceId());
        System.out.println("################################");
    }

    /**
     * 設置流程變量
     */
    @Test
    public void setVariables() {
        // 與任務相關的service,正在執行的service
        TaskService taskService = processEngine.getTaskService();

        // 任務ID
        String taskId = "107508";

        Map<String, Object> variables = new HashMap<String, Object>();
//        variables.put("approve", false);
        variables.put("endOut", true);
//        taskService.removeVariable(taskId, "buyCost");
        taskService.complete(taskId, variables);

        System.out.println("設置流程變量成功!");
        findTask();
    }

    /**
     * 刪除流程定義(刪除key相同的所有不同版本的流程定義)
     */
    @Test
    public void delteProcessDefinitionByKey() {
        // 流程定義的Key
        String processDefinitionKey = "myProcess-test";
        // 先使用流程定義的key查詢流程定義,查詢出所有的版本
        List<ProcessDefinition> list = processEngine.getRepositoryService()
                .createProcessDefinitionQuery()
                .processDefinitionKey(processDefinitionKey)// 使用流程定義的key查詢
                .list();
        // 遍歷,獲取每個流程定義的部署ID
        if (list != null && list.size() > 0) {
            for (ProcessDefinition pd : list) {
                // 獲取部署ID
                String deploymentId = pd.getDeploymentId();
                //      /*
                //       * 不帶級聯的刪除, 只能刪除沒有啟動的流程,如果流程啟動,就會拋出異常
                //       */
                //       processEngine.getRepositoryService().deleteDeployment(deploymentId);

                /**
                 * 級聯刪除 不管流程是否啟動,都可以刪除
                 */
            System.out.println("刪除部署:" + deploymentId);
                processEngine.getRepositoryService().deleteDeployment(
                        deploymentId, true);

            }

        }
    }

    /**
     * 查詢流程狀態(判斷流程正在執行,還是結束)
     */
    @Test
    public void isProcessEnd() {
        String processInstanceId = "25001";
        ProcessInstance pi = processEngine.getRuntimeService()//表示正在執行的流程實例和執行對象
                .createProcessInstanceQuery()//創建流程實例查詢
                .processInstanceId(processInstanceId)//使用流程實例ID查詢
                .singleResult();

        if (pi == null) {
            System.out.println("流程已經結束");
        } else {
            System.out.println("流程沒有結束");
        }
    }

    /**
     * 查詢任務
     * --通過流程實例id
     */
    @Test
    public void findTask() {
//        String processInstanceId = "42501";
        List<HistoricTaskInstance> list = processEngine.getHistoryService()//與歷史數據(歷史表)相關的service
                .createHistoricTaskInstanceQuery()//創建歷史任務實例查詢
//                .processInstanceId(processInstanceId)
                .orderByHistoricActivityInstanceId().asc()
                .list();

        if (list != null && list.size() > 0) {
            for (HistoricTaskInstance hti : list) {
                System.out.println(hti.getId() + "    " +
                        hti.getAssignee() + "    " +
                        hti.getName() + "    " +
                        hti.getProcessInstanceId() + "   " +
                        hti.getStartTime() + "   " +
                        hti.getEndTime() + "   " +
                        hti.getDurationInMillis());
                System.out.println("################################");
            }
        }
    }

    /**
     * 查詢當前人的個人任務
     */
    @Test
    public void findMyPersonTask() {
        String assignee = "sky";
        List<Task> list = processEngine.getTaskService()// 與正在執行的認為管理相關的Service
                .createTaskQuery()// 創建任務查詢對象
                .taskAssignee(assignee)// 指定個人認為查詢,指定辦理人
                .list();

        if (list != null && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任務ID:" + task.getId());
                System.out.println("任務名稱:" + task.getName());
                System.out.println("任務的創建時間" + task);
                System.out.println("任務的辦理人:" + task.getAssignee());
                System.out.println("流程實例ID:" + task.getProcessInstanceId());
                System.out.println("執行對象ID:" + task.getExecutionId());
                System.out.println("流程定義ID:" + task.getProcessDefinitionId());
                System.out.println("#################################");
            }
        }
    }

    /**
     * 得到實際的 組任務列表
     */
    @Test
    public void findGroupTaskList() {
        String groupName1 = "procurementOfManager";
        String groupName2 = "procurementOfPersonnel";

        TaskService taskService = processEngine.getTaskService();
        List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup(groupName1).list();
        System.out.println(groupName1 + " have " + tasks.size() + " tasks:");
        for (int i = 0; i < tasks.size(); i++) {
            System.out.println((i + 1) + ") " + tasks.get(i).getName());
        }
        System.out.println("#################################################");
        TaskService taskService2 = processEngine.getTaskService();
        List<Task> tasks2 = taskService.createTaskQuery().taskCandidateGroup(groupName2).list();
        System.out.println(groupName2 + " have " + tasks2.size() + " tasks:");
        for (int i = 0; i < tasks2.size(); i++) {
            System.out.println((i + 1) + ") " + tasks2.get(i).getName());
        }
    }

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM