课程名称:
SpringBoot+Vue3 项目实战,打造企业级在线办公系统课程章节:
第4章 线下会议管理主讲老师:
神思者
课程内容
当已经有了线下会议室之后,就可以发起会议申请。然后申请人,可以选择对应的会议室。但会议室比较紧张,为了统一管理。需要由人力对会议室的申请进行审批。避免有多人同时申请会议室的情况。
大概的后端处理时序图如下:
应该先写线程任务类(MeetingWorkflowTask
),后面写MeetingService的时候正好可以调用这个任务类。那咱们就在com.example.emos.api.task
包中创建MeetingWorkflowTask.java
类。
因为如果系统引入工作流,并对工作流进行设计与开发。其工作量比较庞大。这里讲师提供了一个封装好的工作流子系统。我们可以直接去引用工作流的能力,实现会议室审批。
线程任务类发送HTTP请求给工作流项目,提交的数据中包括了会议申请人的userId、姓名、部门经理的userId,以及总经理的userId,那么这些数据都是要经过SQL语句查询的。包括线程任务类拿到instanceId之后,要更新tb_meeting表中的记录,所以还需要定义UPDATE语句。
我们按照时序图写程序,思路就清晰多了,看来时序图的作用还真挺重要。
课程收获
在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());
}
}
}