我们现在已经能把会议记录显示在日程表甘特图上面了,但是会议记录是我们用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-api和emos-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