全部开发者教程

企业级在线办公系统

我们现在已经能把会议记录显示在日程表甘特图上面了,但是会议记录是我们用INSERT语句插入到数据表里面的,真正要申请线下会议,还是要在网页上操作。

图片描述

一、熟悉数据表

在弹窗页面填写的内容都是要保存到tb_meeting数据表里面的,写后端代码之前,我们必须再回顾一下数据表的设计。

图片描述
其中uuid字段是随机字符串,它跟定时器有关。当会议审批通过之后,工作流项目会自动创建定时器更新会议的状态。比如说到了开会时间,会议就被定时器修改成了4状态;会议结束之后,定时器自动把会议改成5状态。在工作流项目中,我用会议的UUID值作为定时器的Group名字,可以更好的区分这些定时器实例跟哪个会议有关系,请看下方的示意图。

数据表中的instance_id字段保存的是会议申请工作流实例的ID。我们调用工作流项目,创建了会议申请的工作流实例,工作流项目会返回instance_id值,我们把它保存到数据表里面。将来会议申请通过之后,工作流项目可以利用instance_id值找到对应的会议记录,然后把会议修改成2状态。甚至说将来我们要删除会议的时候,把instance_id值上传给工作里项目删除会议申请的工作流实例。

二、会议申请的工作流接口

因为工作流项目提供了很多Web方法让我们调用,下面我就来说说创建会议申请调用的Web方法。

URI地址:/workflow/startMeetingProcess

序号 参数 备注
1 url 会议审批通过之后的回调通知地址
2 uuid UUID随机字符串,用于定时器的GroupName
3 creatorId 会议发起者的userId
4 creatorName 会议发起者的姓名
5 code 慕课网授权码
6 tcode 本课程授权码
7 title 会议主题
8 date 会议日期
9 start 会议开始时间
10 meetingType 会议类型
11 managerId 申请人所在部门的经理的userId
12 gmId 总经理的userId
13 sameDept 所有的参会人是否隶属同一个部门

返回值:instanceId

三、执行流程

创建会议申请的时候涉及到了emos-apiemos-workflow两个项目,程序之间相互调用比较复杂,所以这里咱们来看看时序图,先把思路缕清。

图片描述
总体上来看,emos-api的Java程序把Ajax提交的数据保存到tb_meeting数据表,然后利用多线程技术,把调用工作流Web方法的任务交给其他线程去做。这么做的好处是当前线程不用等待其他线程的执行结果,当前线程可以直接向浏览器返回响应。毕竟创建工作流实例的过程还是要耗费一些时间的,不采用多线程技术,那么当前线程向工作流项目发出请求之后,直到等到执行结果,才能向浏览器返回响应,这个过程让浏览器等待的时间有点长,所以咱们还是选用多线程技术吧。SpringBoot里面的多线程技术又被称为异步线程,这是因为在当前线程的视角去看,任务交给其他线程去执行,当前线程并不会阻塞,而是继续往下执行,这就跟JS里面的异步执行非常接近了。

四、补充配置信息

1. 开启异步线程

EmosApiApplication.java类中,添加@EnableAsync注解。

@SpringBootApplication
@ServletComponentScan
@Slf4j
@EnableAsync
public class EmosApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(EmosApiApplication.class, args);
    }

}

2. 添加值注入信息

application.yml文件中,添加workflow值注入信息,这样在Java程序中就可以全局引用工作流URL地址了。

workflow:
  url: http://本机IP地址:9090/emos-workflow