公司采购 流程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());
        }
    }

  

时间: 2024-10-05 04:56:06

公司采购 流程flowable例子的相关文章

流程优化实例——采购流程优化

采购是利润的源泉,又是腐败的土壤:采购是制造的龙头,也是生产的紧箍咒:采购是多人向往的职位,也是老板头疼的岗位.采购.采购,到底有没有办法控制漏洞?采购.采购,到底有没有流程能够规范操作?在我看来,答案是肯定的.大家都知道,没有监督的权力必然产生腐败:没有过程的控制,很难达成理想的目标.任何靠个人自觉的管理注定是走不远的.没有制度规范.没有操作流程,圣人去采购也会收回扣,道德模范去采购也会被拉下水.传统的采购流程让一人操办,不出事.不腐败,那才叫奇迹:出事.腐败才叫正常.因此,采购流程应如此优化

采购申请审批流程多效率低,你的采购流程该信息化啦!!!

什么是采购申请审批流程? 采购申请批准流程是指请求批准购买某商品或服务的过程.管理者在根据企业政策购买原材料.设备设施.产品服务等业务需求时,会使用它来批准或拒绝采购申请. 采购申请审批流程步骤 在手动申请管理流程中,一旦确定需求,就会产生纸质的采购申请单并附加如报价和产品规格等支持性单据材料:然后通过申请审批流程转发此采购申请单,请求获得批准后,将生成采购订单. 虽然每个企业都有自己独特的采购业务流程,但是大多数公司关键的采购流程步骤是相似的.以下是采购申请批准流程中涉及的四个关键步骤: 1.

用Leangoo看板工具做采购流程管理

我们可以按照公司的实际情况定制采购流程. 1.在Leangoo中创建一个项目,项目类型建议选择“轻量级协作”,项目模版建议选择“人事与行政” 系统会自动为您创建四个看板,如下图: 图1 2.在项目内创建一个 “办公室采购” 看板. 3.在看板上创建采购流程.下图将流程确定为:采购需求清单.审核中.拒绝.批准.已购买. 4.将领导和相关的同事添加到看板里,需要领导审批的任务卡片可以将领导放至该卡片上. 审核通过,将改卡片移动至“批准”列.反之移动至“拒绝” 这样采购参与者都可以在看板上及时了解采购

公司注册流程

我会在接下来的注册过程中逐步完善该流程. 为公司取一个名字 填写已准备好的公司名称,由工商局上网(工商局内部网)检索是否有重名,如果没有重名,就可以使用这个名称,审核通过后领取<企业名称预先核准通知书>,同时领取相关的设立(开业)登记申请书. 所需文件:<<企业名称预先核准申请书>> (含指定代表或者共同委托代理人授权委托书及身份证件复印件) 常见问题: 核准登记的流程是怎样? 内资企业名称预先核准登记 名字登记要注意什么? 名称登记问题解答 主营项目和经营范围怎么填写

成都房地产公司注册流程

成都房地产公司注册流程由▓▓『四川昊邦』陈经理:13880627755 企业QQ80006684▓▓ 为您提供┻┳═一建筑施工.勘察设计.一体化资质.房地产开发资质--我们拥有成千万资质代办的成功案例事迹,公司以诚信快捷为用户提供全面的资质要闻.<br><br>***************************************************************************************************************&

成都房地产公司注册流程及费用

成都房地产公司注册流程及费用由▓▓『四川昊邦』陈经理:13880627755 企业QQ80006684▓▓ 为您提供┻┳═一建筑施工.勘察设计.一体化资质.房地产开发资质--我们拥有成千万资质代办的成功案例事迹,公司以诚信快捷为用户提供全面的资质要闻.<br><br>*************************************************************************************************************

开公司的流程是怎样的?怎么做好总经理

原文:开公司的流程是怎样的?怎么做好总经理 一.选择公司的形式: 普通的有限责任公司,最低注册资金3万元,需要2个(或以上)股东,从06年1月起新的公司法规定,允许1个股东注册有限责任公司,这种特殊的有限责任公司又称"一人有限公司"(但公司名称中不会有"一人"字样,执照上会注明"自然人独资"),最低注册资金10万元. 如果你和朋友.家人合伙投资创业,可选择普通的有限公司,最低注册资金3万元:如果只有你一个人作为股东,则选择一人有限公司,最低注册资

PO_标准采购流程请购采购接受入库(流程)

2014-06-03 BaoXinjian 一.摘要 介绍一个完整的采购流程,包括操作与对应的底层数据表查询,流程包含了请购->采购->接受->入库 1. 开立请购单 2. 对请购单进行审批 3. 通过自动匹配产生采购单 4. 对采购单进行审批 5. 接收采购单 6. 进行入库交易 二.流程操作 1. 开立请购单 (1). Path: PO-->申请-->申请 请购单PLSQL SELECT prh.requisition_header_id, prh.segment1, p

公司系统流程

今日总结: 公司系统流程大致如下:1.业务员或者客户经理从各种渠道获取客户信息   2.由客户经理或业务员对客户的信息进行录入 3.由客户经理对业主进行沟通,获取客户的认可,交付定金 4.设计师结合业主的房屋格局进行室内设计,经过业主认可后客户经理给出工程报价 5.给客户提交工程方案,再签订施工合同 6.客户支付首款,交由财务审核,审核通过后派施工队到施工现场施工 7.施工队结合施工方案向辅材库提取施工材料