全部开发者教程

企业级在线办公系统

现在我们完成了线下会议的添加和查询功能,线下会议是没有修改功能的,这是为了避免审批过程中用户随意篡改会议申请信息。例如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);
    }
}