longz
2026-04-27 25df88d0ab9d7444ed1d162b9efa1259ac2f6f66
backend/src/main/java/com/sinata/appointment/service/AppointmentApplicationService.java
@@ -1,8 +1,6 @@
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;
@@ -117,44 +115,42 @@
            String approvalStatus,
            String visitorKeyword,
            String visitReasonCode) {
        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,
                                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);
                List<AppointmentAdminExportRow> rows =
                        buildExportRows(
                                orders,
                                pageData.visitorRowsMap(),
                                pageData.approvalInstanceMap(),
                                pageData.reasonNameMap());
                writer.write(rows, sheet);
                if (pageNo * pageSize >= pagedOrders.getTotal()) {
                    break;
                }
                pageNo++;
        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,
                            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;
            }
            writer.finish();
            AdminPageData pageData = loadAdminPageData(orders);
            rows.addAll(
                    buildExportRows(
                            orders,
                            pageData.visitorRowsMap(),
                            pageData.approvalInstanceMap(),
                            pageData.reasonNameMap()));
            if (pageNo * pageSize >= pagedOrders.getTotal()) {
                break;
            }
            pageNo++;
        }
        try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
            EasyExcel.write(bos, AppointmentAdminExportRow.class).sheet("预约记录").doWrite(rows);
            return bos.toByteArray();
        } catch (Exception e) {
            return new byte[0];
@@ -188,7 +184,7 @@
        vo.setVisitedDeptName(defaultText(trimToNull(deptName)));
        vo.setAccessAreaText(defaultText(buildJsonNameText(order.getPassAccessAreaNames())));
        vo.setLocalUnitText(defaultText(buildJsonNameText(order.getPassLocalUnitNames())));
        vo.setPlateNoText(defaultText(joinUniqueTexts(visitorRows, AppointmentVisitor::getPlateNo)));
        vo.setPlateNoText(defaultText(loadOrderPlateText(id)));
        vo.setVisitReasonText(defaultText(buildVisitReasonText(order, reasonNameMap)));
        vo.setVisitStartText(defaultText(resolveVisitStartText(order)));
        vo.setVisitEndText(defaultText(resolveVisitEndText(order)));
@@ -294,6 +290,27 @@
        return result;
    }
    private String loadOrderPlateText(Long orderId) {
        if (orderId == null) {
            return null;
        }
        List<AppointmentVehicle> rows =
                appointmentVehicleMapper.selectList(
                        new LambdaQueryWrapper<AppointmentVehicle>()
                                .eq(AppointmentVehicle::getDelFlag, 0)
                                .eq(AppointmentVehicle::getOrderId, orderId)
                                .orderByAsc(AppointmentVehicle::getId));
        if (rows == null || rows.isEmpty()) {
            return null;
        }
        return rows.stream()
                .map(AppointmentVehicle::getPlateNo)
                .filter(StringUtils::hasText)
                .map(String::trim)
                .distinct()
                .collect(Collectors.joining("、"));
    }
    private Map<Long, List<AppointmentVisitor>> loadVisitorRows(List<Long> orderIds) {
        if (orderIds == null || orderIds.isEmpty()) {
            return Map.of();