全部开发者教程

企业级在线办公系统

上节课我们实现了请假记录的分页查询,接下来应该轮到我要请假这个功能了,其实就是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());
        }
    }
}