上节课我们在前端页面可以成功创建报销申请,但是审批报销申请却需要线上和线下同时进行。报销离不开发票,所以财务和领导在审批报销的时候要核对员工的报销票据。因此员工先要在报销管理页面下载PDF报销单,打印出来之后,贴好报销的发票。然后找财务和领导审核签字。
财务和领导拿到员工的纸质报销单,怎么才能找到线上对应的审批任务?其实很简单,用二维码扫码器,扫描报销单右上角的二维码,就能搜索到对应的审批任务,在系统上选择审批意见就可以了。
大家要注意,在报销单的右上角有二维码,内容是该报销申请的工作流实例instance_id。将来我们想要查询某个报销申请的时候,用扫码枪扫描这个二维码,就能查询到报销记录。
一、编写持久层代码
在TbReimDao.xml
文件中,定义SQL语句。
<select id="searchReimById" parameterType="HashMap" resultType="HashMap">
SELECT r.instance_id AS instanceId,
d.dept_name AS dept,
u.`name`,
DATE_FORMAT( r.create_time, '%Y-%m-%d' ) AS `date`,
r.content,
r.amount,
r.balance,
r.anleihen
FROM tb_reim r
JOIN tb_user u ON r.user_id = u.id
JOIN tb_dept d ON d.id = u.dept_id
WHERE r.id = #{id}
<if test="userId!=null">
AND r.user_id = #{userId}
</if>
</select>
在TBReimDao.java
接口中,声明DAO方法。
public interface TbReimDao {
……
public HashMap searchReimById(HashMap param);
}
二、编写业务层代码
在ReimService.java
接口中,声明抽象方法。
public interface ReimService {
……
public HashMap searchReimById(HashMap param);
}
在ReimServiceImpl.java
类中,实现抽象方法。
public class ReimServiceImpl implements ReimService {
……
@Override
public HashMap searchReimById(HashMap param) {
HashMap map=reimDao.searchReimById(param);
String instanceId = MapUtil.getStr(map, "instanceId");
//把支付订单的URL生成二维码
QrConfig qrConfig = new QrConfig();
qrConfig.setWidth(70);
qrConfig.setHeight(70);
qrConfig.setMargin(2);
String qrCodeBase64 = QrCodeUtil.generateAsBase64(instanceId, qrConfig, "jpg");
map.put("qrCodeBase64",qrCodeBase64);
return map;
}
}
三、编写Web层代码
创建SearchReimByIdForm.java
类,用于封装Ajax提交的数据。
@Data
@Schema(description = "根据ID查询报销单的表单")
public class SearchReimByIdForm {
@NotNull(message = "id不能为空")
@Min(value = 1, message = "id不能小于1")
@Schema(description = "报销单ID")
private Integer id;
}
在ReimController.java
类中,定义Web方法,然后可以用Swagger测试了。
public class ReimController {
……
@PostMapping("/searchReimById")
@Operation(summary = "根据ID查询报销单")
@SaCheckLogin
public R searchReimById(@Valid @RequestBody SearchReimByIdForm form) {
HashMap param = JSONUtil.parse(form).toBean(HashMap.class);
if (!(StpUtil.hasPermission("REIM:SELECT") || StpUtil.hasPermission("ROOT"))) {
param.put("userId", StpUtil.getLoginIdAsInt());
}
HashMap map = reimService.searchReimById(param);
return R.ok(map);
}
}