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


    场景

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

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

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

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

     

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

     

    注:

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

    实现

    思路分析

    首先查看部门表中的数据

     

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

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

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

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

    前端实现

    1、页面添加按钮

    1.       <el-col :span="1.5">
    2.         <el-button
    3.           type="warning"
    4.           plain
    5.           icon="el-icon-download"
    6.           size="mini"
    7.           @click="downloadTemplate"
    8.           v-hasPermi="['wellaccess:statistics:downloadTemplate']"
    9.         >模板下载</el-button>
    10.       </el-col>

    2、下载方法实现

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

    后台实现

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

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. @Builder
    5. public class LimitQuotaStatistics extends BaseEntity
    6. {
    7.     private static final long serialVersionUID = 1L;
    8.     /** id */
    9.     private Long id;
    10.     /** 部门id */
    11.     private Long deptId;
    12.     /** 部门名称 */
    13.     @Excel(name = "部门名称")
    14.     private String deptName;
    15.     /** 夜班人数 */
    16.     @Excel(name = "夜班人数")
    17.     private Long nightShiftNum;
    18.     /** 早班人数 */
    19.     @Excel(name = "早班人数")
    20.     private Long morningShiftNum;
    21.     /** 早中班人数 */
    22.     @Excel(name = "早中班人数")
    23.     private Long morningMiddlleShiftNum;
    24.     /** 晚中班人数 */
    25.     @Excel(name = "晚中班人数")
    26.     private Long nightMiddleShiftNum;
    27.     /** 合计人数 */
    28.     @Excel(name = "合计人数")
    29.     private Long totalNum;
    30.     /** 定额人数 */
    31.     @Excel(name = "定额人数")
    32.     private Long quotaNum;
    33.     /** 计划日期 */
    34.     @JsonFormat(pattern = "yyyy-MM-dd")
    35.     private Date planDate;
    36.     @Override
    37.     public String toString() {
    38.         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
    39.             .append("id", getId())
    40.             .append("deptId", getDeptId())
    41.             .append("deptName", getDeptName())
    42.             .append("nightShiftNum", getNightShiftNum())
    43.             .append("morningShiftNum", getMorningShiftNum())
    44.             .append("morningMiddlleShiftNum", getMorningMiddlleShiftNum())
    45.             .append("nightMiddleShiftNum", getNightMiddleShiftNum())
    46.             .append("totalNum", getTotalNum())
    47.             .append("quotaNum", getQuotaNum())
    48.             .append("planDate", getPlanDate())
    49.             .toString();
    50.     }
    51. }

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

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

    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构造器部分属性

  • 相关阅读:
    简述曼切斯特码的编码规则,并画出00000011的数字时钟,nrz码和曼彻斯特编码波形图。
    初识html
    sublime
    提高 IDC 网络带宽利用率
    数据结构之二叉树
    C# 零基础搭建一个简单的Asp.Net Core WebAip
    Android View转换为Bitmap,实现截屏效果
    【python】爬虫异步网络请求探索async+request与async+aiohttp
    【框架】Spring Framework :SpringBoot
    Class ZipArchive not found,安装zip扩展
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127820909