longz
2026-07-13 5882ba8863d77fdcc168b176c3ffb30e8a20556a
backend/src/main/java/com/sinata/appointment/service/VisitorUserManageApplicationService.java
@@ -1,6 +1,8 @@
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;
@@ -20,7 +22,8 @@
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;
@@ -62,27 +65,58 @@
        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) {