Activiti5审批场景实现(云尚办公)

本文介绍了工作流引擎及审批流程的实现。工作流引擎可使业务流程模板化、自动化,实现流程改变无需修改代码和自动推进。还阐述了审批前的工作,包括审批模版和类型的创建,以及申请和审批流程,涉及前端申请和后端接口处理,数据库会记录申请流程。

资料来源:B站云尚办公

审批篇

审批流程利用Activiti实现,将业务流程模板化及自动化。

工作流引擎简单介绍:

Activiti为工作流引擎:
工作流:

工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。

以专业的方式来实现工作流的管理,并且可以做到业务流程变化之后,我们的程序可以不用改变,如果可以实现这样的效果,那么我们的业务系统的适应能力就得到了极大提升。在这样的背景下,就出现了工作流引擎

为什么使用工作流引擎,能实现业务流程改变,不用修改代码,流程还能自动推进?

(1)我们先来说说为什么流程改变,不用修改代码:我们的工作流引擎都实现了一个规范,这个规范要求我们的流程管理与状态字段无关,始终都是读取业务流程图的下一个节点。当业务更新的时候我们只需要更新业务流程图就行了。这就实现了业务流程改变,不用修改代码。
(2)再来说说流程自动推进,这个原理就更简单了,就拿上面的请假模型来说,工作流引擎会用一张表来记录当前处在的节点。当填写完请假单后肯定是要轮到部门经理来审批了,所以我们一旦完成了请假单填写那么这条记录将会被从这张表删除掉,并且会把下一个节点部门经理的信息插入到这张表中,当我们用部门经理的信息去这张表中查询的时候就能查出部门经理相关的审批的信息了,以此类推,这样层层递进,就实现了流程的自动递交了。


后端所有接口

在这里插入图片描述


一、实现审批前的工作:审批模版和审批类型

申请需要审批模版。只有在审批模版内填写申请信息,然后才能点击申请。

	**审批模版**

在这里插入图片描述

  • 审批模版使用form-create由前端进行实现。后端所需要的就是容纳模版形成JSON数据。同时审批模版由类型分类,如人事,办公等类型。后端需要两张表,一张是审批模板,另一张是审批模板类型。
    在这里插入图片描述
    在这里插入图片描述

  • 模版创造过程

    • 以下是前端界面创造模版过程

    点击添加审批设置(添加模版)

(模版创造过程)

  1. 前端模版信息填写:
    在这里插入图片描述
  2. form-create 创造模版,也就是1.中的表单设置。
    在这里插入图片描述
  3. 上传Activiti中的流程模型。(模型定义的key就是上zip文件名,制作模型的时候记住,后端接口根据文件名部署),至此一个模版上传成功。

后台人员前两步是填写模版基础信息,第三步是上传Activiti中的模型。前两步创造了模板,后一步是上传Activiti流程模型到后台。第三步具体实现看下面接口。前两布创造模版的后端接口省略,不是重点。这里只展示了前端界面过程,为了更好理解审批的场景,为后面开始审批做铺垫。

在这里插入图片描述

- 后端接口位于ProcessTemplateController中
 
 
 //模版保存
//@PreAuthorize("hasAuthority('bnt.processTemplate.templateSet')")
    @ApiOperation(value = "新增")
    @PostMapping("save")
    public Result save(@RequestBody ProcessTemplate processTemplate) {
   
   
        processTemplateService.save(processTemplate);
        return Result.ok();
    }

	//Activiti中模型保存
  @ApiOperation("上传流程定义")
    @PostMapping("uploadProcessDefinition")
    public Result uploadProcessDefinition(@RequestParam("file") MultipartFile multipartFile) throws FileNotFoundException {
   
   

        System.out.println("multipart:   "+multipartFile.toString());
        //得到存储路径
        String absolutePath = new File(ResourceUtils.getURL("").getPath()).getAbsolutePath();

        //上传目录
        File tempFile = new File(absolutePath + "/service-oa/target/classes/processes/");
        if (!tempFile.exists()) tempFile.mkdirs();

        System.out.println("tempFile.getAbsolutePath():  " + tempFile.getAbsolutePath());
        System.out.println("multipartFile.getOriginalFilename():  "+multipartFile.getOriginalFilename());
        //创建空文件用于写入文件
        String finalFileName=multipartFile.getOriginalFilename();
        File finalFile = new File(tempFile.getAbsolutePath() + "/" + multipartFile.getOriginalFilename());

        try {
   
   

            //将文件复制到指定文件
            multipartFile.transferTo(finalFile);
        } catch (IOException e) {
   
   
            e.printStackTrace();
            return Result.fail().message("上传失败");
        }


        Map<String, Object> map = new HashMap<>();
        //根据上传地址后续部署流程定义,文件名称为流程定义的默认key
        map.put("processDefinitionPath", "processes/" + finalFileName);
        map.put("processDefinitionKey", finalFileName.substring(0, finalFileName.lastIndexOf(".")));
        return Result.ok(map);
    }
  • 到这里审批模板制作完成,但是接下来即将开始审批,需要Activiti实现。所以需要将刚才上传到后台的Activiti审批流程模型 部署到Activiti中。

ps:审批的定义就是审批流程的实现,这里审批流程的业务逻辑由Activiti实现。而审批流程就是刚上传的模型,需要在Activiti进行流程部署。

PS: 前端将部署过程定义为 发布

在这里插入图片描述

后端接口ProcesstemplateController

  //@PreAuthorize("hasAuthority('bnt.processTemplate.publish')")
    @ApiOperation(value = "发布")
    @GetMapping("/publish/{id}")
    public Result publish(@PathVariable Long id) {
   
   
        processTemplateService.publish(id);
        return Result.ok();
    }

ProcesstemplateServiceImpl

  @Transactional
    @Override
    public void publish(Long id) {
   
   

        ProcessTemplate processTemplate = this.getById(id);
        processTemplate.setStatus(1);
        int update = processTemplateMapper.updateById(processTemplate);


        //优先发布在线流程设计
        if (!StringUtils.isEmpty(processTemplate.getProcessDefinitionPath())) {
   
   
            processService.deployByZip(processTemplate.getProcessDefinitionPath());
        }


    }

ProcessServiceImpl

@Override
    public void deployByZip(String deployPath) {
   
   

            //通过部署地址找到zip文件,转为二进制文件
        //this.getClass().getClassLoader().getResourceAsStream(deployPath);
        /*
        String prePath=null;
        try {
             prePath= ResourceUtils.getURL("").getPath()+"/service-oa/src/main/java/processes/";
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }*/
        InputStream inputStream  = this.getClass().getClassLoader().getResourceAsStream(deployPath);
        ZipInputStream zipInputStream
                = new ZipInputStream(inputStream);

        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值