上节课我们实现了请假记录的分页查询,接下来应该轮到我要请假这个功能了,其实就是CRUD操作中的添加。我们不仅要往tb_leave
表中添加请假记录,还要调用工作流项目,创建请假审批工作流实例。既然要调用工作流,基本都要用异步线程任务,所以这节课我们把异步线程任务类给封装好,以便下节课业务层的代码调用。
线程任务类发送HTTP请求给工作流项目,提交的数据中包括了请假申请人的userId、姓名、部门经理的userId,以及总经理的userId,那么这些数据都是要经过SQL语句查询的。包括线程任务类拿到instanceId
之后,要更新tb_leave
表中的记录,所以还需要定义UPDATE语句。看来线程任务类的内容还挺复杂的,所以搭建请看下面的时序图。
一、编写持久层代码
TbUserDao
类中的searchUserInfo()
、searchDeptManagerId()
、searchGmId()
方法,我们在创建会议申请的时候就调用过,所以这些DAO方法我们不用管。
在TbLeaveDao.xml
文件中,定义更新请假记录instance_id
字段值的SQL语句。
<update id="updateLeaveInstanceId" parameterType="HashMap">
UPDATE tb_leave
SET instance_id = #{instanceId}
WHERE id = #{id}
</update>
在TbLeaveDao.java
接口中,定义DAO方法。
public interface TbLeaveDao {
……
public int updateLeaveInstanceId(HashMap param);
}
二、定义线程任务类
调用工作流项目的Web方法,需要传入若干参数。
URL路径:/workflow/startLeaveProcess
序号 | 参数名 | 类型 | 含义 |
---|---|---|---|
1 | url | String | 接收审批结果的Web方法 |
2 | creatorId | String | 申请人的userId |
3 | creatorName | String | 申请人的姓名 |
4 | code | String | 慕课网授权字符串 |
5 | tcode | String | 课程授权字符串 |
6 | title | String | 请假的标题 |
7 | managerId | int | 部门经理userId |
8 | gmId | int | 总经理的userId |
9 | days | double | 请假天数 |
在com.example.emos.api.task
包中创建LeaveWorkflowTask.java
类,代码如下:
@Component
@Slf4j
public class LeaveWorkflowTask {
@Value("${emos.code}")
private String code;
@Value("${emos.tcode}")
private String tcode;
@Value("${workflow.url}")
private String workflow;
@Value("${emos.recieveNotify}")
private String recieveNotify;
@Autowired
private TbUserDao userDao;
@Autowired
private TbLeaveDao leaveDao;
@Async("AsyncTaskExecutor")
public void startLeaveWorkflow(int id,int creatorId,String days) {
HashMap info = userDao.searchUserInfo(creatorId);
JSONObject json = new JSONObject();
json.set("url", recieveNotify);
json.set("creatorId", creatorId);
json.set("creatorName", info.get("name").toString());
json.set("code", code);
json.set("tcode", tcode);
json.set("title", info.get("dept").toString() + info.get("name").toString() + "的请假");
Integer managerId = userDao.searchDeptManagerId(creatorId);
json.set("managerId", managerId);
Integer gmId = userDao.searchGmId();
json.set("gmId", gmId);
json.set("days", Double.parseDouble(days));
String url = workflow + "/workflow/startLeaveProcess";
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("id", id);
param.put("instanceId", instanceId);
int row = leaveDao.updateLeaveInstanceId(param);
if (row != 1) {
throw new EmosException("保存请假工作流实例ID失败");
}
} else {
log.error(resp.body());
}
}
}