若依前后端分离版获取部门表所有最子级部门并匹配部门名称生成excel

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 若依前后端分离版获取部门表所有最子级部门并匹配部门名称生成excel,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

场景

若依前后端分离版手把手教你本地搭建环境并运行项目:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 

在上面搭建起来项目的基础上,业务需求是每天上报各个最子级部门的人数计划。

需要从部门表中动态获取当前所有最低级部门的部门名称并导出excel。

若依前后端分离版获取部门表所有最子级部门并匹配部门名称生成excel 

比如部门表数据如上,需要获取所有最子级部门的部门名称并导出excel如下

若依前后端分离版获取部门表所有最子级部门并匹配部门名称生成excel

 

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi 
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

思路分析

首先查看部门表中的数据

若依前后端分离版获取部门表所有最子级部门并匹配部门名称生成excel

 

其实需要获取这些部门的部门名称,除了使用复杂的sql语句去实现之外,还可以使用投机取巧的方式去实现。

观测其ancestors字段,所有最子级部门的长度是最长的。

所以获取所有数据中ancestors中长度最长的数据即可,但是这样需要限制好录入和使用的规则,必须是最子级部门,

这里就假定只能有三级部门,不允许再有第四级部门。

前端实现

1、页面添加按钮

      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-download"
          size="mini"
          @click="downloadTemplate"
          v-hasPermi="['wellaccess:statistics:downloadTemplate']"
        >模板下载</el-button>
      </el-col>

2、下载方法实现

    /** 下载模板 */
    downloadTemplate(){
      this.download(
        'wellaccess/statistics/downloadTemplate',
        {},
        `井下各单位入井人数定额统计表模板.xlsx`
      );
    },

后台实现

1、新建业务实体类,就是部门名称后面跟的计划人数等

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class LimitQuotaStatistics extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** id */
    private Long id;

    /** 部门id */
    private Long deptId;

    /** 部门名称 */
    @Excel(name = "部门名称")
    private String deptName;

    /** 夜班人数 */
    @Excel(name = "夜班人数")
    private Long nightShiftNum;

    /** 早班人数 */
    @Excel(name = "早班人数")
    private Long morningShiftNum;

    /** 早中班人数 */
    @Excel(name = "早中班人数")
    private Long morningMiddlleShiftNum;

    /** 晚中班人数 */
    @Excel(name = "晚中班人数")
    private Long nightMiddleShiftNum;

    /** 合计人数 */
    @Excel(name = "合计人数")
    private Long totalNum;

    /** 定额人数 */
    @Excel(name = "定额人数")
    private Long quotaNum;

    /** 计划日期 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planDate;

    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("id", getId())
            .append("deptId", getDeptId())
            .append("deptName", getDeptName())
            .append("nightShiftNum", getNightShiftNum())
            .append("morningShiftNum", getMorningShiftNum())
            .append("morningMiddlleShiftNum", getMorningMiddlleShiftNum())
            .append("nightMiddleShiftNum", getNightMiddleShiftNum())
            .append("totalNum", getTotalNum())
            .append("quotaNum", getQuotaNum())
            .append("planDate", getPlanDate())
            .toString();
    }
}

2、其他通过代码生成实现,下面主要看controller

    @PostMapping("/downloadTemplate")
    public void downloadTemplate(HttpServletResponse response)
    {
        //查询所有部门数据
        List<SysDept> sysDeptList = sysDeptService.selectDeptList(new SysDept());
        //获取子部门的长度
        //此规则需严格限制部门表中所有最子级部门不能有子部门
        int maxLength = sysDeptList.stream().reduce((x, y) -> x.getAncestors().length() > y.getAncestors().length() ? x : y).get().getAncestors().length();
        //筛选所有子部门并获取带部门名称的对象list
        List<LimitQuotaStatistics> limitQuotaStatisticsList = sysDeptList.stream()
                .filter(sysDept -> sysDept.getAncestors().length() == maxLength)
                .map(sysDept -> LimitQuotaStatistics.builder().deptName(sysDept.getDeptName()).build())
                .collect(Collectors.toList());
        //导出excel/下载模板
        ExcelUtil<LimitQuotaStatistics> util = new ExcelUtil<>(LimitQuotaStatistics.class);
        util.exportExcel(response, limitQuotaStatisticsList, "自定义名称"+ LocalDate.now());
    }

3、实现逻辑说明

首先查询所有的部门数据的list

然后获取ancestors中的最大长度,通过java8的stream的reduce,具体可参考如下

Java8新特性-Stream对集合进行操作的常用API:

Java8新特性-Stream对集合进行操作的常用API_霸道流氓气质的博客-CSDN博客_javalist.stream

然后调用filter进行过滤,筛选出长度为最大长度的部门数据-再调用map将部门list的每个部门名称作为参数构造需要的业务对象并进行映射,最后调用collect转换为业务对象list。

map的使用也可参考上面java8 stream的使用。

这里通过部门名称构造业务对象的方式可参考如下

SpringBoot+Lombok+Builder实现任意个数属性的对象构造:

SpringBoot+Lombok+Builder实现任意个数属性的对象构造_霸道流氓气质的博客-CSDN博客_lombok构造器部分属性

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135870.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!