现在我们完成了线下会议的添加和查询功能,线下会议是没有修改功能的,这是为了避免审批过程中用户随意篡改会议申请信息。例如A用户申请的7月20日上午9点钟的会议,部门经理审批通过之后,轮到总经理审批。这时候如果申请人随意修改会议信息,那么部门经理的审批是有效的还是无效的呢?肯定说不清楚,因此干脆咱们就禁止用户修改会议信息。如果你觉得会议信息填写的有问题,可以先删除会议申请,然后重新提交正确的会议申请。注意,只有会议申请人才有资格删除会议。
一、编写异步线程任务类
在com.example.emos.api.task
包中创建MeetingWorkflowTask.java
类,在其中声明异步线程方法。
@Component
@Slf4j
public class MeetingWorkflowTask {
……
@Async("AsyncTaskExecutor")
public void deleteMeetingApplication(String uuid, String instanceId, String reason) {
JSONObject json = new JSONObject();
json.set("uuid", uuid);
json.set("instanceId", instanceId);
json.set("code", code);
json.set("tcode", tcode);
json.set("type", "会议申请");
json.set("reason", reason);
String url = workflow + "/workflow/deleteProcessById";
HttpResponse resp = HttpRequest.post(url).header("Content-Type", "application/json")
.body(json.toString()).execute();
if (resp.getStatus() == 200) {
log.debug("删除了会议申请");
}
else{
log.error(resp.body());
}
}
}
二、编写持久层代码
在TbMeetingDao.xml
文件中,定义SQL语句。
<delete id="deleteMeetingApplication" parameterType="HashMap">
DELETE FROM tb_meeting
WHERE id=${id} AND creator_id=#{creatorId}
</delete>
在TbMeetingDao.java
接口中,定义抽象DAO方法。
public interface TbMeetingDao {
……
public int deleteMeetingApplication(HashMap param);
}
三、编写业务层代码
在MeetingService.java
接口中,定义抽象方法。
public interface MeetingService {
……
public int deleteMeetingApplication(HashMap param);
}
在MeetingServiceImpl.java
类中,实现抽象方法。
public class MeetingServiceImpl implements MeetingService {
……
@Override
public int deleteMeetingApplication(HashMap param) {
Long id = MapUtil.getLong(param, "id");
String uuid = MapUtil.getStr(param, "uuid");
String instanceId = MapUtil.getStr(param, "instanceId");
//查询会议详情,一会儿要判断是否距离会议开始不足20分钟
HashMap meeting = meetingDao.searchMeetingById(param);
String date = MapUtil.getStr(meeting, "date");
String start = MapUtil.getStr(meeting, "start");
int status = MapUtil.getInt(meeting, "status");
boolean isCreator = Boolean.parseBoolean(MapUtil.getStr(meeting, "isCreator"));
DateTime dateTime = DateUtil.parse(date + " " + start);
DateTime now = DateUtil.date();
//距离会议开始不足20分钟,不能删除会议
if (now.isAfterOrEquals(dateTime.offset(DateField.MINUTE, -20))) {
throw new EmosException("距离会议开始不足20分钟,不能删除会议");
}
//只能申请人删除该会议
if (!isCreator) {
throw new EmosException("只能申请人删除该会议");
}
//待审批和未开始的会议可以删除
if (status == 1 || status == 3) {
int rows = meetingDao.deleteMeetingApplication(param);
if (rows == 1) {
String reason = param.get("reason").toString();
meetingWorkflowTask.deleteMeetingApplication(uuid, instanceId, reason);
}
return rows;
} else {
throw new EmosException("只能删除待审批和未开始的会议");
}
}
}
四、编写Web层代码
创建DeleteMeetingApplicationForm.java
类,封装Ajax提交的数据。
@Data
@Schema(description = "删除会议申请表单")
public class DeleteMeetingApplicationForm {
@NotNull(message = "id不能为空")
@Min(value = 1)
@Schema(description = "id")
private Long id;
@NotBlank(message = "uuid不能为空")
@Schema(description = "uuid")
private String uuid;
@NotBlank(message = "instanceId不能为空")
@Schema(description = "工作流instanceId")
private String instanceId;
@NotBlank(message = "原因不能为空")
@Schema(description = "原因")
private String reason;
}
编写MeetingController.java
中的Web方法。
public class MeetingController {
……
@PostMapping("/deleteMeetingApplication")
@Operation(summary = "删除会议申请")
@SaCheckLogin
public R deleteMeetingApplication(@Valid @RequestBody DeleteMeetingApplicationForm form) {
HashMap param = JSONUtil.parse(form).toBean(HashMap.class);
param.put("creatorId", StpUtil.getLoginIdAsLong());
param.put("userId", StpUtil.getLoginIdAsLong());
int rows = meetingService.deleteMeetingApplication(param);
return R.ok().put("rows", rows);
}
}