上节课我们测试了报销申请的审批流程,一切都很正常,甚至归档的时候上传文件到云端也是没问题的。那么这节课我们要做的是删除报销申请功能,先把后端代码写了,下节课我们去写前端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);
}
}