From c4db0a4526f61758272c92396aa788d84f098102 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期二, 21 四月 2026 17:04:30 +0800
Subject: [PATCH] 风险规避

---
 backend/src/main/java/com/sinata/appointment/service/AppointmentApplicationService.java |  217 +++++++++++++++++++----------------------------------
 1 files changed, 78 insertions(+), 139 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 e4f9120..3314f48 100644
--- a/backend/src/main/java/com/sinata/appointment/service/AppointmentApplicationService.java
+++ b/backend/src/main/java/com/sinata/appointment/service/AppointmentApplicationService.java
@@ -1,6 +1,8 @@
 package com.sinata.appointment.service;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+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;
@@ -87,19 +89,21 @@
             String approvalStatus,
             String visitorKeyword,
             String visitReasonCode) {
-        List<AppointmentAdminListVo> all =
-                listAdminOrders(
-                        visitedUserName,
+        Page<AppointmentOrder> orderPage = new Page<>(Math.max(1L, page), Math.max(1L, size));
+        IPage<AppointmentOrder> pagedOrders =
+                appointmentOrderMapper.pageAdminOrders(
+                        orderPage,
+                        trimToNull(visitedUserName),
                         visitedDeptId,
-                        accessArea,
-                        localUnit,
+                        trimToNull(accessArea),
+                        trimToNull(localUnit),
                         visitDateStart,
                         visitDateEnd,
-                        displayStatus,
-                        approvalStatus,
-                        visitorKeyword,
-                        visitReasonCode);
-        return slicePage(page, size, all);
+                        trimToNull(displayStatus),
+                        trimToNull(approvalStatus),
+                        trimToNull(visitorKeyword),
+                        trimToNull(visitReasonCode));
+        return buildAdminPage(pagedOrders);
     }
 
     public byte[] exportExcel(
@@ -113,53 +117,44 @@
             String approvalStatus,
             String visitorKeyword,
             String visitReasonCode) {
-        Set<Long> visitorOrderIds = findOrderIdsByVisitorKeyword(visitorKeyword);
-        if (visitorOrderIds != null && visitorOrderIds.isEmpty()) {
-            return writeExportRows(List.of());
-        }
-
-        List<AppointmentOrder> orders =
-                appointmentOrderMapper.selectList(
-                        buildOrderQuery(
-                                visitedUserName,
+        try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
+            ExcelWriter writer = EasyExcel.write(bos, AppointmentAdminExportRow.class).build();
+            WriteSheet sheet = EasyExcel.writerSheet("预约记录").build();
+            long pageNo = 1L;
+            long pageSize = 200L;
+            while (true) {
+                Page<AppointmentOrder> orderPage = new Page<>(pageNo, pageSize);
+                IPage<AppointmentOrder> pagedOrders =
+                        appointmentOrderMapper.pageAdminOrders(
+                                orderPage,
+                                trimToNull(visitedUserName),
                                 visitedDeptId,
-                                accessArea,
-                                localUnit,
+                                trimToNull(accessArea),
+                                trimToNull(localUnit),
                                 visitDateStart,
                                 visitDateEnd,
-                                visitReasonCode,
-                                visitorOrderIds));
-        if (orders.isEmpty()) {
-            return writeExportRows(List.of());
-        }
-
-        List<Long> orderIds = orders.stream().map(AppointmentOrder::getId).filter(Objects::nonNull).toList();
-        Map<Long, List<AppointmentVisitor>> visitorRowsMap = loadVisitorRows(orderIds);
-        Map<Long, ApprovalInstance> approvalInstanceMap = loadApprovalInstanceMap(orderIds);
-        Map<Long, String> deptNameMap = loadDeptNameMap(orders);
-        Map<String, String> reasonNameMap = loadReasonNameMap(orders);
-
-        List<AppointmentOrder> filteredOrders = new ArrayList<>();
-        for (AppointmentOrder order : orders) {
-            AppointmentAdminListVo vo =
-                    toAdminListVo(
-                            order,
-                            deptNameMap.get(order.getVisitedDeptId()),
-                            reasonNameMap,
-                            visitorRowsMap.get(order.getId()),
-                            approvalInstanceMap.get(order.getId()));
-            if (matchesDisplayStatus(vo, displayStatus) && matchesApprovalStatus(vo, approvalStatus)) {
-                filteredOrders.add(order);
+                                trimToNull(displayStatus),
+                                trimToNull(approvalStatus),
+                                trimToNull(visitorKeyword),
+                                trimToNull(visitReasonCode));
+                List<AppointmentOrder> orders = pagedOrders.getRecords();
+                if (orders == null || orders.isEmpty()) {
+                    break;
+                }
+                AdminPageData pageData = loadAdminPageData(orders);
+                List<AppointmentAdminExportRow> rows =
+                        buildExportRows(
+                                orders,
+                                pageData.visitorRowsMap(),
+                                pageData.approvalInstanceMap(),
+                                pageData.reasonNameMap());
+                writer.write(rows, sheet);
+                if (pageNo * pageSize >= pagedOrders.getTotal()) {
+                    break;
+                }
+                pageNo++;
             }
-        }
-
-        List<AppointmentAdminExportRow> rows = buildExportRows(filteredOrders, visitorRowsMap, approvalInstanceMap, reasonNameMap);
-        return writeExportRows(rows);
-    }
-
-    private byte[] writeExportRows(List<AppointmentAdminExportRow> rows) {
-        try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
-            EasyExcel.write(bos, AppointmentAdminExportRow.class).sheet("预约记录").doWrite(rows);
+            writer.finish();
             return bos.toByteArray();
         } catch (Exception e) {
             return new byte[0];
@@ -215,99 +210,37 @@
                         .orderByAsc(AppointmentVisitor::getId));
     }
 
-    private List<AppointmentAdminListVo> listAdminOrders(
-            String visitedUserName,
-            Long visitedDeptId,
-            String accessArea,
-            String localUnit,
-            LocalDate visitDateStart,
-            LocalDate visitDateEnd,
-            String displayStatus,
-            String approvalStatus,
-            String visitorKeyword,
-            String visitReasonCode) {
-        Set<Long> visitorOrderIds = findOrderIdsByVisitorKeyword(visitorKeyword);
-        if (visitorOrderIds != null && visitorOrderIds.isEmpty()) {
-            return List.of();
+
+    private IPage<AppointmentAdminListVo> buildAdminPage(IPage<AppointmentOrder> pagedOrders) {
+        Page<AppointmentAdminListVo> page =
+                new Page<>(pagedOrders.getCurrent(), pagedOrders.getSize(), pagedOrders.getTotal());
+        List<AppointmentOrder> orders = pagedOrders.getRecords();
+        if (orders == null || orders.isEmpty()) {
+            page.setRecords(List.of());
+            return page;
         }
-
-        List<AppointmentOrder> orders =
-                appointmentOrderMapper.selectList(
-                        buildOrderQuery(
-                                visitedUserName,
-                                visitedDeptId,
-                                accessArea,
-                                localUnit,
-                                visitDateStart,
-                                visitDateEnd,
-                                visitReasonCode,
-                                visitorOrderIds));
-        if (orders.isEmpty()) {
-            return List.of();
-        }
-
-        List<Long> orderIds = orders.stream().map(AppointmentOrder::getId).filter(Objects::nonNull).toList();
-        Map<Long, List<AppointmentVisitor>> visitorRowsMap = loadVisitorRows(orderIds);
-        Map<Long, ApprovalInstance> approvalInstanceMap = loadApprovalInstanceMap(orderIds);
-        Map<Long, String> deptNameMap = loadDeptNameMap(orders);
-        Map<String, String> reasonNameMap = loadReasonNameMap(orders);
-
-        List<AppointmentAdminListVo> result = new ArrayList<>();
+        AdminPageData pageData = loadAdminPageData(orders);
+        List<AppointmentAdminListVo> records = new ArrayList<>();
         for (AppointmentOrder order : orders) {
-            AppointmentAdminListVo vo =
+            records.add(
                     toAdminListVo(
                             order,
-                            deptNameMap.get(order.getVisitedDeptId()),
-                            reasonNameMap,
-                            visitorRowsMap.get(order.getId()),
-                            approvalInstanceMap.get(order.getId()));
-            if (matchesDisplayStatus(vo, displayStatus) && matchesApprovalStatus(vo, approvalStatus)) {
-                result.add(vo);
-            }
+                            pageData.deptNameMap().get(order.getVisitedDeptId()),
+                            pageData.reasonNameMap(),
+                            pageData.visitorRowsMap().get(order.getId()),
+                            pageData.approvalInstanceMap().get(order.getId())));
         }
-        return result;
+        page.setRecords(records);
+        return page;
     }
 
-    private LambdaQueryWrapper<AppointmentOrder> buildOrderQuery(
-            String visitedUserName,
-            Long visitedDeptId,
-            String accessArea,
-            String localUnit,
-            LocalDate visitDateStart,
-            LocalDate visitDateEnd,
-            String visitReasonCode,
-            Set<Long> visitorOrderIds) {
-        LambdaQueryWrapper<AppointmentOrder> q = new LambdaQueryWrapper<>();
-        q.eq(AppointmentOrder::getDelFlag, 0);
-        q.like(StringUtils.hasText(visitedUserName), AppointmentOrder::getVisitedUserName, trim(visitedUserName));
-        q.eq(visitedDeptId != null, AppointmentOrder::getVisitedDeptId, visitedDeptId);
-        q.like(StringUtils.hasText(accessArea), AppointmentOrder::getPassAccessAreaNames, trim(accessArea));
-        q.like(StringUtils.hasText(localUnit), AppointmentOrder::getPassLocalUnitNames, trim(localUnit));
-        q.eq(StringUtils.hasText(visitReasonCode), AppointmentOrder::getVisitReasonCode, trim(visitReasonCode));
-        q.le(visitDateEnd != null, AppointmentOrder::getVisitStartDate, visitDateEnd);
-        q.ge(visitDateStart != null, AppointmentOrder::getVisitEndDate, visitDateStart);
-        if (visitorOrderIds != null) {
-            q.in(AppointmentOrder::getId, visitorOrderIds);
-        }
-        q.orderByDesc(AppointmentOrder::getCreateTime).orderByDesc(AppointmentOrder::getId);
-        return q;
-    }
-
-    private Set<Long> findOrderIdsByVisitorKeyword(String visitorKeyword) {
-        String keyword = trimToNull(visitorKeyword);
-        if (!StringUtils.hasText(keyword)) {
-            return null;
-        }
-        List<AppointmentVisitor> rows =
-                appointmentVisitorMapper.selectList(
-                        new LambdaQueryWrapper<AppointmentVisitor>()
-                                .eq(AppointmentVisitor::getDelFlag, 0)
-                                .like(AppointmentVisitor::getName, keyword)
-                                .select(AppointmentVisitor::getOrderId));
-        return rows.stream()
-                .map(AppointmentVisitor::getOrderId)
-                .filter(Objects::nonNull)
-                .collect(Collectors.toCollection(LinkedHashSet::new));
+    private AdminPageData loadAdminPageData(List<AppointmentOrder> orders) {
+        List<Long> orderIds = orders.stream().map(AppointmentOrder::getId).filter(Objects::nonNull).toList();
+        return new AdminPageData(
+                loadVisitorRows(orderIds),
+                loadApprovalInstanceMap(orderIds),
+                loadDeptNameMap(orders),
+                loadReasonNameMap(orders));
     }
 
     private Map<Long, MpVisitor> loadVisitorMap(List<AppointmentVisitor> rows) {
@@ -927,4 +860,10 @@
         }
         return null;
     }
+
+    private record AdminPageData(
+            Map<Long, List<AppointmentVisitor>> visitorRowsMap,
+            Map<Long, ApprovalInstance> approvalInstanceMap,
+            Map<Long, String> deptNameMap,
+            Map<String, String> reasonNameMap) {}
 }

--
Gitblit v1.7.1