全部开发者教程

企业级在线办公系统

上节课我们测试了报销申请的审批流程,一切都很正常,甚至归档的时候上传文件到云端也是没问题的。那么这节课我们要做的是删除报销申请功能,先把后端代码写了,下节课我们去写前端JS代码。另外,在本案例中但凡涉及到工作流的地方,都不允许中途修改。用户可以先删除申请,然后再创建新的申请。

图片描述

一、编写异步线程任务类

ReimWorkflowTask.java类中,声明异步线程方法。

public class ReimWorkflowTask {
    ……
    @Async("AsyncTaskExecutor")
    public void deleteReimWorkflow(String instanceId, String type, String reason) {
        JSONObject json = new JSONObject();
        json.set("instanceId", instanceId);
        json.set("type", type);
        json.set("reason", reason);
        json.set("code", code);
        json.set("tcode", tcode);
        String url = workflow + "/workflow/deleteProcessById";
        HttpResponse resp = HttpRequest.post(url).header("Content-Type", "application/json")
                .body(json.toString()).execute();
        if (resp.getStatus() != 200) {
            log.error(resp.body());
            throw new EmosException("报销工作流删除失败");
        }
    }
}

二、编写持久层代码

TbReimDao.xml文件中,定义SQL语句。

<select id="searchInstanceIdById" parameterType="int" resultType="String">
    SELECT instance_id AS instanceId
    FROM tb_reim
    WHERE id = #{id}
</select>

<delete id="deleteReimById" parameterType="HashMap">
    DELETE FROM tb_reim
    WHERE id = #{id}
    AND user_id = #{userId}
    AND status IN(1,2)
</delete>

TbReimDao.java文件中,声明DAO方法。

public interface TbReimDao {
    ……
    public String searchInstanceIdById(int id);
    public int deleteReimById(HashMap param);
}

三、编写业务层代码

ReimService.java接口中,声明抽象方法。

public interface ReimService {
    ……
    public int deleteReimById(HashMap param);
}

ReimServiceImpl.java接口中,实现抽象方法。

public class ReimServiceImpl implements ReimService {
    ……
    @Override
    public int deleteReimById(HashMap param) {
        int id=MapUtil.getInt(param,"id");
        String instanceId=reimDao.searchInstanceIdById(id);
        int rows = reimDao.deleteReimById(param);
        if(rows==1){
            //关闭工作流
            reimWorkflowTask.deleteReimWorkflow(instanceId, "报销申请", "删除报销申请");
        }
        return rows;
    }
}

四、编写Web层代码

创建DeleteReimByIdForm.java类,封装Ajax提交的数据。

@Data
@Schema(description = "根据ID删除报销记录")
public class DeleteReimByIdForm {
    @NotNull(message = "id不能为空")
    @Min(value = 1, message = "id不能小于1")
    @Schema(description = "报销单ID")
    private Integer id;
}

ReimController.java类中,定义Web方法,然后用Swagger测试一下。

public class ReimController {
    ……
    @PostMapping("/deleteReimById")
    @Operation(summary = "添加报销申请")
    @SaCheckLogin
    public R deleteReimById(@Valid @RequestBody DeleteReimByIdForm form) {
        HashMap param = JSONUtil.parse(form).toBean(HashMap.class);
        param.put("userId", StpUtil.getLoginIdAsInt());
        int rows = reimService.deleteReimById(param);
        return R.ok().put("rows", rows);
    }
}