全部开发者教程

企业级在线办公系统

上节课我们在前端页面可以成功创建报销申请,但是审批报销申请却需要线上和线下同时进行。报销离不开发票,所以财务和领导在审批报销的时候要核对员工的报销票据。因此员工先要在报销管理页面下载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);
    }
}