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