From 5882ba8863d77fdcc168b176c3ffb30e8a20556a Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期一, 13 七月 2026 17:54:25 +0800
Subject: [PATCH] 缩短二维码原始参数

---
 backend/src/main/java/com/sinata/appointment/service/VisitorUserManageApplicationService.java |   66 +++++++++++++++++++++++++--------
 1 files changed, 50 insertions(+), 16 deletions(-)

diff --git a/backend/src/main/java/com/sinata/appointment/service/VisitorUserManageApplicationService.java b/backend/src/main/java/com/sinata/appointment/service/VisitorUserManageApplicationService.java
index af0883c..261a561 100644
--- a/backend/src/main/java/com/sinata/appointment/service/VisitorUserManageApplicationService.java
+++ b/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,29 +65,60 @@
         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(
-                        buildVisitorQuery(
-                                userName, mobile, companyName, registerStartDate, registerEndDate, status));
-        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];
+            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));
+                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();
+                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) {
         MpUser user = loadVisitorUserWithUuid(id, uuid);
         VisitorUserDetailVo vo = new VisitorUserDetailVo();

--
Gitblit v1.7.1