| | |
| | | package com.sinata.appointment.service; |
| | | |
| | | import com.alibaba.excel.ExcelWriter; |
| | | import com.alibaba.excel.EasyExcel; |
| | | import com.alibaba.excel.write.metadata.WriteSheet; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | |
| | | import com.sinata.appointment.util.MobileMaskUtil; |
| | | import com.sinata.appointment.util.PhoneNormalize; |
| | | import com.sinata.appointment.util.UuidAssert; |
| | | import java.io.ByteArrayOutputStream; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | |
| | | return result.convert(user -> toListVo(user, bookingCountMap)); |
| | | } |
| | | |
| | | public byte[] exportExcel( |
| | | public void exportExcel( |
| | | HttpServletResponse response, |
| | | String userName, |
| | | String mobile, |
| | | String companyName, |
| | | LocalDate registerStartDate, |
| | | LocalDate registerEndDate, |
| | | Integer status) { |
| | | List<MpUser> users = |
| | | mpUserMapper.selectList( |
| | | Integer status) |
| | | throws IOException { |
| | | prepareExcelResponse(response, "visitor-users.xlsx"); |
| | | long pageNo = 1L; |
| | | long pageSize = 500L; |
| | | boolean wroteAnyPage = false; |
| | | try (ExcelWriter writer = |
| | | EasyExcel.write(response.getOutputStream(), VisitorUserExportRow.class).build()) { |
| | | WriteSheet sheet = EasyExcel.writerSheet("访客信息").build(); |
| | | while (true) { |
| | | IPage<MpUser> page = |
| | | mpUserMapper.selectPage( |
| | | new Page<>(pageNo, pageSize), |
| | | buildVisitorQuery( |
| | | userName, mobile, companyName, registerStartDate, registerEndDate, status)); |
| | | userName, |
| | | mobile, |
| | | companyName, |
| | | registerStartDate, |
| | | registerEndDate, |
| | | status)); |
| | | List<MpUser> users = page.getRecords(); |
| | | if (users == null || users.isEmpty()) { |
| | | break; |
| | | } |
| | | List<Long> userIds = users.stream().map(MpUser::getId).filter(Objects::nonNull).toList(); |
| | | Map<Long, Long> bookingCountMap = loadBookingCountMap(userIds); |
| | | List<VisitorUserExportRow> rows = |
| | | users.stream().map(user -> toExportRow(user, bookingCountMap)).toList(); |
| | | try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { |
| | | EasyExcel.write(bos, VisitorUserExportRow.class).sheet("访客信息").doWrite(rows); |
| | | return bos.toByteArray(); |
| | | } catch (Exception e) { |
| | | return new byte[0]; |
| | | writer.write(rows, sheet); |
| | | wroteAnyPage = true; |
| | | if (pageNo * pageSize >= page.getTotal()) { |
| | | break; |
| | | } |
| | | pageNo++; |
| | | } |
| | | if (!wroteAnyPage) { |
| | | writer.write(List.of(), sheet); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void prepareExcelResponse(HttpServletResponse response, String filename) { |
| | | response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); |
| | | response.setCharacterEncoding("UTF-8"); |
| | | response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); |
| | | } |
| | | |
| | | public VisitorUserDetailVo detail(Long id, String uuid) { |