From 2a3c3cdbf2398695d61633e072f98ee2757e9e27 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期二, 11 八月 2026 11:20:26 +0800
Subject: [PATCH] feat(appointment): 添加访客预约系统解除绑定功能

---
 backend/src/main/java/com/sinata/appointment/service/AppointmentApplicationService.java |   93 +++++++++++++++++++++++++++-------------------
 1 files changed, 54 insertions(+), 39 deletions(-)

diff --git a/backend/src/main/java/com/sinata/appointment/service/AppointmentApplicationService.java b/backend/src/main/java/com/sinata/appointment/service/AppointmentApplicationService.java
index d87666c..f2d6deb 100644
--- a/backend/src/main/java/com/sinata/appointment/service/AppointmentApplicationService.java
+++ b/backend/src/main/java/com/sinata/appointment/service/AppointmentApplicationService.java
@@ -38,7 +38,10 @@
 import com.sinata.appointment.util.MobileMaskUtil;
 import com.sinata.appointment.util.SensitiveDataUtil;
 import com.sinata.appointment.util.UuidAssert;
-import java.io.ByteArrayOutputStream;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -110,7 +113,8 @@
         return buildAdminPage(pagedOrders);
     }
 
-    public byte[] exportExcel(
+    public void exportExcel(
+            HttpServletResponse response,
             String visitedUserName,
             Long visitedDeptId,
             Long accessAreaId,
@@ -121,49 +125,60 @@
             String displayStatus,
             String approvalStatus,
             String visitorKeyword,
-            String visitReasonCode) {
+            String visitReasonCode)
+            throws IOException {
+        prepareExcelResponse(response, "appointments.xlsx");
         List<Long> accessAreaIds = resolveAccessAreaFilterIds(accessAreaId);
         long pageNo = 1L;
         long pageSize = 200L;
-        List<AppointmentAdminExportRow> rows = new ArrayList<>();
-        while (true) {
-            Page<AppointmentOrder> orderPage = new Page<>(pageNo, pageSize);
-            IPage<AppointmentOrder> pagedOrders =
-                    appointmentOrderMapper.pageAdminOrders(
-                            orderPage,
-                            trimToNull(visitedUserName),
-                            visitedDeptId,
-                            accessAreaIds,
-                            trimToNull(accessArea),
-                            trimToNull(localUnit),
-                            visitDateStart,
-                            visitDateEnd,
-                            trimToNull(displayStatus),
-                            trimToNull(approvalStatus),
-                            trimToNull(visitorKeyword),
-                            trimToNull(visitReasonCode));
-            List<AppointmentOrder> orders = pagedOrders.getRecords();
-            if (orders == null || orders.isEmpty()) {
-                break;
+        boolean wroteAnyPage = false;
+        try (ExcelWriter writer =
+                EasyExcel.write(response.getOutputStream(), AppointmentAdminExportRow.class).build()) {
+            WriteSheet sheet = EasyExcel.writerSheet("预约记录").build();
+            while (true) {
+                Page<AppointmentOrder> orderPage = new Page<>(pageNo, pageSize);
+                IPage<AppointmentOrder> pagedOrders =
+                        appointmentOrderMapper.pageAdminOrders(
+                                orderPage,
+                                trimToNull(visitedUserName),
+                                visitedDeptId,
+                                accessAreaIds,
+                                trimToNull(accessArea),
+                                trimToNull(localUnit),
+                                visitDateStart,
+                                visitDateEnd,
+                                trimToNull(displayStatus),
+                                trimToNull(approvalStatus),
+                                trimToNull(visitorKeyword),
+                                trimToNull(visitReasonCode));
+                List<AppointmentOrder> orders = pagedOrders.getRecords();
+                if (orders == null || orders.isEmpty()) {
+                    break;
+                }
+                AdminPageData pageData = loadAdminPageData(orders);
+                writer.write(
+                        buildExportRows(
+                                orders,
+                                pageData.visitorRowsMap(),
+                                pageData.approvalInstanceMap(),
+                                pageData.reasonNameMap()),
+                        sheet);
+                wroteAnyPage = true;
+                if (pageNo * pageSize >= pagedOrders.getTotal()) {
+                    break;
+                }
+                pageNo++;
             }
-            AdminPageData pageData = loadAdminPageData(orders);
-            rows.addAll(
-                    buildExportRows(
-                            orders,
-                            pageData.visitorRowsMap(),
-                            pageData.approvalInstanceMap(),
-                            pageData.reasonNameMap()));
-            if (pageNo * pageSize >= pagedOrders.getTotal()) {
-                break;
+            if (!wroteAnyPage) {
+                writer.write(List.of(), sheet);
             }
-            pageNo++;
         }
-        try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
-            EasyExcel.write(bos, AppointmentAdminExportRow.class).sheet("预约记录").doWrite(rows);
-            return bos.toByteArray();
-        } catch (Exception e) {
-            return new byte[0];
-        }
+    }
+
+    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 AppointmentOrder getById(Long id, String uuid) {

--
Gitblit v1.7.1