From aabd3fb155475168427f1c14966beb873bff6763 Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期二, 25 八月 2026 19:31:46 +0800
Subject: [PATCH] fix: complete appointment management data and filters

---
 talent-card-server/src/main/java/com/talentcard/server/service/ServiceAppointmentAdminService.java |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/talent-card-server/src/main/java/com/talentcard/server/service/ServiceAppointmentAdminService.java b/talent-card-server/src/main/java/com/talentcard/server/service/ServiceAppointmentAdminService.java
index 861fb0d..3928bf5 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/service/ServiceAppointmentAdminService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/service/ServiceAppointmentAdminService.java
@@ -59,13 +59,13 @@
     @Transactional(readOnly = true)
     public PageResult<Map<String, Object>> page(String applicationType, String keyword, String applicantName,
                                                 String applicantMobile, String serviceKeyword,
-                                                String cardLevel, String status, String submittedStart,
+                                                String cardLevel, String subsidy, String submissionType, String status, String submittedStart,
                                                 String submittedEnd, int page, int size) {
         int safePage = Math.max(page, 1);
         int safeSize = Math.min(Math.max(size, 1), 100);
-        QueryWrapper<ServiceApplication> countWrapper = filter(applicationType, keyword, applicantName, applicantMobile, serviceKeyword, cardLevel, status, submittedStart, submittedEnd);
+        QueryWrapper<ServiceApplication> countWrapper = filter(applicationType, keyword, applicantName, applicantMobile, serviceKeyword, cardLevel, subsidy, submissionType, status, submittedStart, submittedEnd);
         Long total = applicationMapper.selectCount(countWrapper);
-        QueryWrapper<ServiceApplication> pageWrapper = filter(applicationType, keyword, applicantName, applicantMobile, serviceKeyword, cardLevel, status, submittedStart, submittedEnd)
+        QueryWrapper<ServiceApplication> pageWrapper = filter(applicationType, keyword, applicantName, applicantMobile, serviceKeyword, cardLevel, subsidy, submissionType, status, submittedStart, submittedEnd)
                 .orderByDesc("submitted_at", "id")
                 .last("limit " + safeSize + " offset " + ((safePage - 1) * safeSize));
         List<Map<String, Object>> records = applicationMapper.selectList(pageWrapper).stream()
@@ -101,7 +101,7 @@
         if (REJECTED_STATUSES.contains(nextStatus) && remark.isBlank()) {
             throw new BusinessException(ErrorCode.BAD_REQUEST, "拒绝或驳回时必须填写处理备注");
         }
-        String handlerName = first(request.handlerName(), operatorId == null ? "" : "管理员" + operatorId, "管理员");
+        String handlerName = first(operatorName(operatorId), request.handlerName(), "管理员");
         LocalDateTime handledAt = PENDING_STATUSES.contains(nextStatus) ? null : LocalDateTime.now();
         UpdateWrapper<ServiceApplication> update = new UpdateWrapper<ServiceApplication>()
                 .set("status", nextStatus)
@@ -135,8 +135,8 @@
     @Transactional(readOnly = true)
     public byte[] exportExcel(String applicationType, String keyword, String applicantName,
                               String applicantMobile, String serviceKeyword,
-                              String cardLevel, String status, String submittedStart, String submittedEnd) {
-        QueryWrapper<ServiceApplication> wrapper = filter(applicationType, keyword, applicantName, applicantMobile, serviceKeyword, cardLevel, status, submittedStart, submittedEnd)
+                              String cardLevel, String subsidy, String submissionType, String status, String submittedStart, String submittedEnd) {
+        QueryWrapper<ServiceApplication> wrapper = filter(applicationType, keyword, applicantName, applicantMobile, serviceKeyword, cardLevel, subsidy, submissionType, status, submittedStart, submittedEnd)
                 .orderByDesc("submitted_at", "id");
         List<ServiceApplication> applications = applicationMapper.selectList(wrapper);
         String[] headers = {
@@ -175,7 +175,7 @@
 
     private QueryWrapper<ServiceApplication> filter(String applicationType, String keyword, String applicantName,
                                                     String applicantMobile, String serviceKeyword,
-                                                    String cardLevel, String status, String submittedStart, String submittedEnd) {
+                                                    String cardLevel, String subsidy, String submissionType, String status, String submittedStart, String submittedEnd) {
         QueryWrapper<ServiceApplication> wrapper = new QueryWrapper<ServiceApplication>().eq("deleted", 0);
         String type = normalizeFilterType(applicationType);
         if (!type.isBlank()) {
@@ -218,6 +218,17 @@
         if (!clean(cardLevel).isBlank()) {
             wrapper.eq("talent_level", clean(cardLevel));
         }
+        String subsidyValue = clean(subsidy);
+        if ("是".equals(subsidyValue)) {
+            wrapper.eq("subsidy", "是");
+        } else if ("否".equals(subsidyValue)) {
+            wrapper.and(query -> query.eq("subsidy", "否").or().isNull("subsidy").or().eq("subsidy", ""));
+        } else if (!subsidyValue.isBlank()) {
+            wrapper.eq("subsidy", subsidyValue);
+        }
+        if (!clean(submissionType).isBlank()) {
+            wrapper.eq("submission_type", clean(submissionType));
+        }
         if (!clean(status).isBlank()) {
             wrapper.eq("status", clean(status));
         }
@@ -258,6 +269,7 @@
         result.put("appointmentTime", first(application.getExpectedTime(), "以专员通知为准"));
         result.put("applicantName", participantName(application));
         result.put("applicantMobile", sensitiveDataCrypto.decrypt(first(application.getApplicantMobile(), application.getSpouseMobile(), application.getTalentMobile())));
+        result.put("guestCount", guestCount(application));
         if (ServiceAppointmentApplicationService.TYPE_SPOUSE.equals(application.getApplicationType())) {
             result.put("spouseName", first(application.getSpouseName(), application.getApplicantName()));
             result.put("spouseMobile", sensitiveDataCrypto.decrypt(first(application.getSpouseMobile(), application.getApplicantMobile())));
@@ -270,6 +282,7 @@
 
     private Map<String, Object> detailView(ServiceApplication application) {
         Map<String, Object> result = listView(application);
+        result.put("handlerName", handlerName(application));
         result.put("talentId", application.getTalentId());
         result.put("cardId", application.getCardId());
         result.put("merchantId", application.getMerchantId());
@@ -280,7 +293,7 @@
         result.put("applicantIdCardNo", sensitiveDataCrypto.decrypt(application.getApplicantIdCardNo()));
         result.put("checkInDate", application.getCheckInDate());
         result.put("checkOutDate", application.getCheckOutDate());
-        result.put("guestCount", application.getGuestCount());
+        result.put("guestCount", guestCount(application));
         result.put("subsidy", application.getSubsidy());
         result.put("remark", application.getRejectReason());
         result.put("estimatedProcessingTime", application.getEstimatedProcessingTime());
@@ -444,6 +457,36 @@
         return first(application.getApplicantName(), application.getSpouseName(), application.getChildName(), application.getTalentName());
     }
 
+    private Integer guestCount(ServiceApplication application) {
+        if (application.getGuestCount() != null) {
+            return application.getGuestCount();
+        }
+        return ServiceAppointmentApplicationService.TYPE_HOTEL.equals(application.getApplicationType()) ? 1 : null;
+    }
+
+    private String handlerName(ServiceApplication application) {
+        if (application.getHandledAt() == null) {
+            return first(application.getHandlerName());
+        }
+        ServiceApplicationOperationLog log = operationLogMapper.selectOne(
+                new QueryWrapper<ServiceApplicationOperationLog>()
+                        .eq("application_id", application.getId())
+                        .eq("operation_type", "STATUS_UPDATE")
+                        .eq("after_status", application.getStatus())
+                        .orderByDesc("created_at", "id")
+                        .last("limit 1")
+        );
+        return first(
+                log == null ? "" : operatorName(log.getOperatorId()),
+                log == null ? "" : log.getOperatorName(),
+                application.getHandlerName()
+        );
+    }
+
+    private String operatorName(Long operatorId) {
+        return operatorId == null ? "" : first(operationLogMapper.selectOperatorName(operatorId));
+    }
+
     private List<String> proofFileIds(String value) {
         if (value == null || value.isBlank()) {
             return List.of();

--
Gitblit v1.7.1