fix
longz
2026-05-26 cb44316d3975af52a3a9af824094b844dd7df874
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.sinata.appointment.service;
 
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sinata.appointment.dto.MiniAppointmentListVo;
import com.sinata.appointment.dto.MiniApprovalAllVo;
import com.sinata.appointment.dto.MiniApprovalTodoVo;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
 
@Service
@RequiredArgsConstructor
public class MiniApprovalAggregateApplicationService {
 
    private static final long MAX_FETCH_SIZE = 1000L;
 
    private final MiniHandlerApprovalApplicationService miniHandlerApprovalApplicationService;
    private final MiniAppointmentApplicationService miniAppointmentApplicationService;
 
    public IPage<MiniApprovalAllVo> pageMyAll(long page, long size, String visitorNameKeyword, LocalDate visitDate) {
        long safePage = Math.max(1L, page);
        long safeSize = Math.max(1L, size);
        long fetchSize = Math.min(MAX_FETCH_SIZE, safePage * safeSize);
 
        IPage<MiniApprovalTodoVo> todoPage =
                miniHandlerApprovalApplicationService.pageMyTodoAll(1L, fetchSize, visitorNameKeyword, visitDate);
        IPage<MiniAppointmentListVo> historyPage =
                miniAppointmentApplicationService.pageMine(1L, fetchSize, null, visitorNameKeyword, visitDate);
 
        List<MiniApprovalAllVo> merged = new ArrayList<>();
        merged.addAll(mapTodoRows(todoPage.getRecords()));
        merged.addAll(mapHistoryRows(historyPage.getRecords()));
        merged.sort(Comparator.comparing(MiniApprovalAllVo::getCreateTime, Comparator.nullsLast(Comparator.naturalOrder())).reversed());
 
        return slicePage(safePage, safeSize, merged);
    }
 
    private List<MiniApprovalAllVo> mapTodoRows(List<MiniApprovalTodoVo> rows) {
        if (rows == null || rows.isEmpty()) {
            return List.of();
        }
        List<MiniApprovalAllVo> out = new ArrayList<>(rows.size());
        for (MiniApprovalTodoVo row : rows) {
            MiniApprovalAllVo vo = new MiniApprovalAllVo();
            vo.setTaskId(row.getTaskId());
            vo.setTaskUuid(row.getTaskUuid());
            vo.setOrderId(row.getOrderId());
            vo.setOrderUuid(row.getOrderUuid());
            vo.setOrderNo(row.getOrderNo());
            vo.setStatus("PENDING");
            vo.setStatusText("待审核");
            vo.setNodeText(row.getNodeName() == null ? "待审核" : row.getNodeName());
            vo.setVisitorDisplayText(row.getVisitorDisplayText());
            vo.setPlateNoText(row.getPlateNoText());
            vo.setVisitTimeText(row.getVisitTimeText());
            vo.setVisitReasonCode(row.getVisitReasonCode());
            vo.setVisitReasonText(row.getVisitReasonText());
            vo.setCreateTime(row.getCreateTime());
            out.add(vo);
        }
        return out;
    }
 
    private List<MiniApprovalAllVo> mapHistoryRows(List<MiniAppointmentListVo> rows) {
        if (rows == null || rows.isEmpty()) {
            return List.of();
        }
        List<MiniApprovalAllVo> out = new ArrayList<>(rows.size());
        for (MiniAppointmentListVo row : rows) {
            MiniApprovalAllVo vo = new MiniApprovalAllVo();
            vo.setOrderId(row.getId());
            vo.setOrderUuid(row.getUuid());
            vo.setOrderNo(row.getOrderNo());
            String status = normalizeStatus(row.getStatus());
            vo.setStatus(status);
            vo.setStatusText(resolveStatusText(status));
            vo.setNodeText(resolveStatusText(status));
            vo.setVisitorDisplayText(row.getVisitorDisplayText());
            vo.setPlateNoText(row.getPlateNoText());
            vo.setVisitTimeText(row.getVisitTimeText());
            vo.setVisitReasonCode(row.getVisitReasonCode());
            vo.setVisitReasonText(row.getVisitReasonText());
            vo.setCreateTime(row.getCreateTime());
            out.add(vo);
        }
        return out;
    }
 
    private String normalizeStatus(String status) {
        if (status == null) {
            return "OTHER";
        }
        String upper = status.toUpperCase(Locale.ROOT);
        return switch (upper) {
            case "PENDING", "APPROVED", "REJECTED", "CANCELLED" -> upper;
            default -> "OTHER";
        };
    }
 
    private String resolveStatusText(String status) {
        return switch (status) {
            case "APPROVED" -> "已同意";
            case "REJECTED" -> "已拒绝";
            case "CANCELLED" -> "已取消";
            case "PENDING" -> "待审核";
            default -> "已处理";
        };
    }
 
    private IPage<MiniApprovalAllVo> slicePage(long page, long size, List<MiniApprovalAllVo> rowsAll) {
        long total = rowsAll == null ? 0 : rowsAll.size();
        int from = (int) Math.min(total, (page - 1) * size);
        int to = (int) Math.min(total, from + size);
        List<MiniApprovalAllVo> records = from >= to ? List.of() : rowsAll.subList(from, to);
        Page<MiniApprovalAllVo> out = new Page<>(page, size);
        out.setTotal(total);
        out.setRecords(records);
        return out;
    }
}