全部开发者教程

企业级在线办公系统

首页 慕课教程 企业级在线办公系统 企业级在线办公系统 11-2 查询罚款类别分页数据(后端)

上一章我们实现了违纪罚款模块,我们添加罚款记录的时候,罚款类别列表中的内容好像是固定的,那么罚款类别能动态添加吗?当然是可以的。

在系统设置菜单下面,有罚款类型栏目,对应的是amect_type.vue页面。在这个页面中我们可以对罚款类型做CRUD操作。

图片描述
有个细节,每个罚款类型记录都带有未缴纳罚款数量列,看来我们想要显示分页数据,单表查询是不行了,我们要让tb_amect_type表和其他数据表做连接,并且汇总统计才能得到我们想要的数据。唉!SQL语句真难写,但是学会了写复杂SQL语句,再复杂的业务也难不倒我们。

一、编写持久层代码

tb_amect_type数据表结构如下,其中systemic字段代表是否为系统内置的罚款类型。Emos系统允许修改这些系统内置的罚款类型,但是不允许删除这些记录。用户自己创建的罚款类型,可以随便删除。

图片描述
TbAmectTypeDao.xml文件中,定义SQL语句。

<select id="searchAmectTypeByPage" parameterType="HashMap" resultType="HashMap">
    SELECT `at`.id,
           `at`.type,
           `at`.money,
           `at`.systemic,
           COUNT( a.type_id ) AS notPay,
           IF(COUNT(a.id)=0 AND systemic=false ,"true","false") AS canDelete
    FROM tb_amect_type `at`
    LEFT JOIN tb_amect a ON `at`.id = a.type_id AND a.`status` = 1
    WHERE 1=1
    <if test="type!=null">
        AND `at`.type LIKE '%${type}%'
    </if>
    GROUP BY `at`.id
    LIMIT #{start}, #{length}
</select>
<select id="searchAmectTypeCount" parameterType="HashMap" resultType="long">
    SELECT COUNT(temp.ct)
    FROM (
        SELECT COUNT(*) AS ct
        FROM tb_amect_type `at`
        LEFT JOIN tb_amect a ON `at`.id = a.type_id AND a.`status` = 1
        WHERE 1=1
        <if test="type!=null">
            AND `at`.type LIKE '%${type}%'
        </if>
        GROUP BY `at`.id
    ) temp
</select>

TbAmectTypeDao.java接口中,声明DAO方法。

public interface TbAmectTypeDao {
    ……
    public ArrayList<HashMap> searchAmectTypeByPage(HashMap param);
    public long searchAmectTypeCount(HashMap param);
}

二、编写业务层代码

AmectTypeService.java接口中,定义抽象方法。

public interface AmectTypeService {
    ……
    public PageUtils searchAmectTypeByPage(HashMap param);
}

AmectTypeServiceImpl.java类中,实现抽象方法。

public class AmectTypeServiceImpl implements AmectTypeService {
    ……
    @Override
    public PageUtils searchAmectTypeByPage(HashMap param) {
        ArrayList<HashMap> list = amectTypeDao.searchAmectTypeByPage(param);

        long count = amectTypeDao.searchAmectTypeCount(param);
        int start = (Integer) param.get("start");
        int length = (Integer) param.get("length");
        PageUtils pageUtils = new PageUtils(list, count, start, length);
        return pageUtils;
    }
}

三、编写Web层代码

创建SearchAmectTypeByPageForm.java类,用于封装Ajax提交的数据。

@Data
@Schema(description = "查询罚款类型分页记录表单")
public class SearchAmectTypeByPageForm {
    @Pattern(regexp = "^[0-9a-zA-Z\\u4e00-\\u9fa5]{1,10}$", message = "type内容不正确")
    @Schema(description = "类型名称")
    private String type;

    @NotNull(message = "page不能为空")
    @Min(value = 1, message = "page不能小于1")
    @Schema(description = "页数")
    private Integer page;

    @NotNull(message = "length不能为空")
    @Range(min = 10, max = 50, message = "length必须为10~50之间")
    @Schema(description = "每页记录数")
    private Integer length;
}

AmectTypeController.java类中,定义Web方法,然后可以用Swagger测试Web方法。

public class AmectTypeController {
    ……
    @PostMapping("/searchAmectTypeByPage")
    @Operation(summary = "查询罚款类型分页记录")
    @SaCheckPermission(value = {"ROOT"})
    public R searchAmectTypeByPage(@Valid @RequestBody SearchAmectTypeByPageForm form) {
        int page = form.getPage();
        int length = form.getLength();
        int start = (page - 1) * length;
        HashMap param = JSONUtil.parse(form).toBean(HashMap.class);
        param.put("start", start);
        PageUtils pageUtils = amectTypeService.searchAmectTypeByPage(param);
        return R.ok().put("page", pageUtils);
    }
}