场景
若依前后端分离版手把手教你本地搭建环境并运行项目:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662
在上面搭建起来项目的基础上,业务需求是每天上报各个最子级部门的人数计划。
需要从部门表中动态获取当前所有最低级部门的部门名称并导出excel。
比如部门表数据如上,需要获取所有最子级部门的部门名称并导出excel如下
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
思路分析
首先查看部门表中的数据
其实需要获取这些部门的部门名称,除了使用复杂的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:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657
然后调用filter进行过滤,筛选出长度为最大长度的部门数据-再调用map将部门list的每个部门名称作为参数构造需要的业务对象并进行映射,最后调用collect转换为业务对象list。
map的使用也可参考上面java8 stream的使用。
这里通过部门名称构造业务对象的方式可参考如下
SpringBoot+Lombok+Builder实现任意个数属性的对象构造:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126384244
标签:excel,private,部门,最子级,Long,人数,append From: https://www.cnblogs.com/badaoliumangqizhi/p/16883883.html