我们再来回顾一下创建会议申请的时序图,看看我们应该从哪下笔写程序。
我们应该先写线程任务类(MeetingWorkflowTask),后面写MeetingService的时候正好可以调用这个任务类。那咱们就在com.example.emos.api.task
包中创建MeetingWorkflowTask.java
类。
线程任务类发送HTTP请求给工作流项目,提交的数据中包括了会议申请人的userId、姓名、部门经理的userId,以及总经理的userId,那么这些数据都是要经过SQL语句查询的。包括线程任务类拿到instanceId
之后,要更新tb_meeting
表中的记录,所以还需要定义UPDATE语句。看来线程任务类的内容还挺复杂的,所以搭建请看下面的时序图。
我们按照时序图写程序,思路就清晰多了,看来时序图的作用还真挺重要。
TbUserDao
类中的searchUserInfo()
、searchDeptManagerId()
、searchGmId()
;TbMeetingDao
类中的searchMeetingMembersInSameDept()
函数,以及它们对应的SQL语句,在我上一门实战课里面都已经讲过了,所以这里就不重复说明了,直接调用即可。
在TbMeetingDao.xml
文件中,定义更新会议记录instance_id
字段值的SQL语句。
<update id="updateMeetingInstanceId" parameterType="HashMap"> UPDATE tb_meeting SET instance_id=#{instanceId} WHERE uuid=#{uuid} </update>
代码块预览 复制
- 1
- 2
- 3
- 4
- 5
在TbMeetingDao.java
接口中,定义DAO方法。
public interface TbMeetingDao { …… public int updateMeetingInstanceId(HashMap param); }
代码块预览 复制
- 1
- 2
- 3
- 4
首先我们要在application.yml
文件中,定义接收会议审批结果的URL地址。目前这个URL对应的Web方法还没有创建,一会儿我们去创建这个Web方法。
emos: …… recieveNotify: http://本机ID地址:8090/emos-api/meeting/recieveNotify
代码块预览 复制
- 1
- 2
- 3
在com.example.emos.api.task
包中创建MeetingWorkflowTask.java
类,代码如下:
@Component @Slf4j public class MeetingWorkflowTask { @Autowired private TbUserDao userDao; @Autowired private TbMeetingDao meetingDao; @Value("${emos.recieveNotify}") private String recieveNotify; @Value("${emos.code}") private String code; @Value("${emos.tcode}") private String tcode; @Value("${workflow.url}") private String workflow; @Async("AsyncTaskExecutor") public void startMeetingWorkflow(String uuid, int creatorId,String title, String date, String start,String meetingType) { //查询申请人基本信息 HashMap info = userDao.searchUserInfo(creatorId); JSONObject json = new JSONObject(); json.set("url", recieveNotify); json.set("uuid", uuid); json.set("creatorId",creatorId); json.set("creatorName",info.get("name").toString()); json.set("code", code); json.set("tcode", tcode); json.set("title",title); json.set("date", date); json.set("start", start); json.set("meetingType",meetingType); String[] roles = info.get("roles").toString().split(","); //判断用户角色是不是总经理,总经理创建的会议不需要审批,所以不需要查询总经理userId和部门经理userId if (!ArrayUtil.contains(roles, "总经理")) { //查询部门经理userId Integer managerId = userDao.searchDeptManagerId(creatorId); json.set("managerId", managerId); //查询总经理userId Integer gmId = userDao.searchGmId(); json.set("gmId", gmId); //查询参会人是否为同一个部门 boolean bool = meetingDao.searchMeetingMembersInSameDept(uuid); json.set("sameDept", bool); } String url = workflow + "/workflow/startMeetingProcess"; HttpResponse resp = HttpRequest.post(url).header("Content-Type", "application/json") .body(json.toString()).execute(); if (resp.getStatus() == 200) { json = JSONUtil.parseObj(resp.body()); String instanceId = json.getStr("instanceId"); HashMap param = new HashMap(); param.put("uuid", uuid); param.put("instanceId", instanceId); //更新会议记录的instance_id字段 int row = meetingDao.updateMeetingInstanceId(param); if (row != 1) { throw new EmosException("保存会议工作流实例ID失败"); } } else { log.error(resp.body()); } } }
代码块预览 复制
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74