我们再来回顾一下创建会议申请的时序图,看看我们应该从哪下笔写程序。
我们应该先写线程任务类(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>
在TbMeetingDao.java
接口中,定义DAO方法。
public interface TbMeetingDao {
……
public int updateMeetingInstanceId(HashMap param);
}
二、定义线程任务类
首先我们要在application.yml
文件中,定义接收会议审批结果的URL地址。目前这个URL对应的Web方法还没有创建,一会儿我们去创建这个Web方法。
emos:
……
recieveNotify: http://本机ID地址:8090/emos-api/meeting/recieveNotify
在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());
}
}
}