全部开发者教程

企业级在线办公系统

首页 慕课教程 企业级在线办公系统 企业级在线办公系统 7-7 用异步线程开启线下会议审批流程

我们再来回顾一下创建会议申请的时序图,看看我们应该从哪下笔写程序。

图片描述
我们应该先写线程任务类(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());
        }
    }
}