From 25df88d0ab9d7444ed1d162b9efa1259ac2f6f66 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期一, 27 四月 2026 10:13:53 +0800
Subject: [PATCH] 小程序对接finish

---
 backend/src/main/java/com/sinata/appointment/service/PostApprovalOrchestrationService.java |   82 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 82 insertions(+), 0 deletions(-)

diff --git a/backend/src/main/java/com/sinata/appointment/service/PostApprovalOrchestrationService.java b/backend/src/main/java/com/sinata/appointment/service/PostApprovalOrchestrationService.java
index a4134cb..0ec81b6 100644
--- a/backend/src/main/java/com/sinata/appointment/service/PostApprovalOrchestrationService.java
+++ b/backend/src/main/java/com/sinata/appointment/service/PostApprovalOrchestrationService.java
@@ -8,6 +8,7 @@
 import com.sinata.appointment.constants.QrcodeTicketStatus;
 import com.sinata.appointment.constants.SystemSettingKeys;
 import com.sinata.appointment.entity.ApprovalInstance;
+import com.sinata.appointment.entity.ApprovalTask;
 import com.sinata.appointment.entity.AppointmentOrder;
 import com.sinata.appointment.entity.AppointmentVisitor;
 import com.sinata.appointment.entity.BizVisitReason;
@@ -17,6 +18,7 @@
 import com.sinata.appointment.mapper.AppointmentOrderMapper;
 import com.sinata.appointment.mapper.AppointmentVisitorMapper;
 import com.sinata.appointment.mapper.ApprovalInstanceMapper;
+import com.sinata.appointment.mapper.ApprovalTaskMapper;
 import com.sinata.appointment.mapper.BizVisitReasonMapper;
 import com.sinata.appointment.mapper.MpUserMapper;
 import com.sinata.appointment.mapper.MpVisitorMapper;
@@ -30,6 +32,7 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.UUID;
+import java.util.stream.Stream;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -51,6 +54,7 @@
     private final QrcodeTicketMapper qrcodeTicketMapper;
     private final AppointmentOrderMapper appointmentOrderMapper;
     private final ApprovalInstanceMapper approvalInstanceMapper;
+    private final ApprovalTaskMapper approvalTaskMapper;
     private final AppointmentVisitorMapper appointmentVisitorMapper;
     private final MpVisitorMapper mpVisitorMapper;
     private final MpUserMapper mpUserMapper;
@@ -147,6 +151,8 @@
 
         try {
             integrationWechatService.notifyApprovalFinalResult(order, true);
+            integrationWechatService.notifyApprovalNoticeUsers(
+                    order, true, loadNoticeUsers(latestInstance.getId()), visitors.size());
         } catch (Exception e) {
             log.warn("{} orderId={} failed: {}", IntegrationConstant.WECHAT_NOTIFY_EVENT, order.getId(), e.getMessage());
         }
@@ -164,6 +170,16 @@
         appointmentOrderMapper.updateById(order);
         try {
             integrationWechatService.notifyApprovalFinalResult(order, false);
+            ApprovalInstance latestInstance = loadLatestInstance(order.getId());
+            if (latestInstance != null) {
+                List<AppointmentVisitor> visitors =
+                        appointmentVisitorMapper.selectList(
+                                new LambdaQueryWrapper<AppointmentVisitor>()
+                                        .eq(AppointmentVisitor::getDelFlag, 0)
+                                        .eq(AppointmentVisitor::getOrderId, order.getId()));
+                integrationWechatService.notifyApprovalNoticeUsers(
+                        order, false, loadNoticeUsers(latestInstance.getId()), visitors.size());
+            }
         } catch (Exception e) {
             log.warn(
                     "{} orderId={} failed: {}",
@@ -173,6 +189,72 @@
         }
     }
 
+    private ApprovalInstance loadLatestInstance(Long orderId) {
+        if (orderId == null) {
+            return null;
+        }
+        return approvalInstanceMapper.selectOne(
+                new LambdaQueryWrapper<ApprovalInstance>()
+                        .eq(ApprovalInstance::getDelFlag, 0)
+                        .eq(ApprovalInstance::getOrderId, orderId)
+                        .orderByDesc(ApprovalInstance::getId)
+                        .last("limit 1"));
+    }
+
+    private List<MpUser> loadNoticeUsers(Long instanceId) {
+        if (instanceId == null) {
+            return List.of();
+        }
+        List<ApprovalTask> tasks =
+                approvalTaskMapper.selectList(
+                        new LambdaQueryWrapper<ApprovalTask>()
+                                .eq(ApprovalTask::getDelFlag, 0)
+                                .eq(ApprovalTask::getInstanceId, instanceId)
+                                .isNotNull(ApprovalTask::getNoticeIds)
+                                .ne(ApprovalTask::getNoticeIds, "")
+                                .orderByAsc(ApprovalTask::getId));
+        if (tasks.isEmpty()) {
+            return List.of();
+        }
+        LinkedHashSet<Long> noticeUserIds = new LinkedHashSet<>();
+        for (ApprovalTask task : tasks) {
+            noticeUserIds.addAll(parseCommaSeparatedIds(task.getNoticeIds()));
+        }
+        if (noticeUserIds.isEmpty()) {
+            return List.of();
+        }
+        List<MpUser> users =
+                mpUserMapper.selectList(
+                        new LambdaQueryWrapper<MpUser>()
+                                .eq(MpUser::getDelFlag, 0)
+                                .in(MpUser::getId, noticeUserIds));
+        Map<Long, MpUser> userMap = new LinkedHashMap<>();
+        for (MpUser user : users) {
+            userMap.putIfAbsent(user.getId(), user);
+        }
+        return noticeUserIds.stream().map(userMap::get).filter(Objects::nonNull).toList();
+    }
+
+    private List<Long> parseCommaSeparatedIds(String raw) {
+        if (!StringUtils.hasText(raw)) {
+            return List.of();
+        }
+        return Stream.of(raw.split(","))
+                .filter(StringUtils::hasText)
+                .map(String::trim)
+                .map(value -> {
+                    try {
+                        return Long.parseLong(value);
+                    } catch (NumberFormatException ex) {
+                        return null;
+                    }
+                })
+                .filter(Objects::nonNull)
+                .filter(id -> id > 0)
+                .distinct()
+                .toList();
+    }
+
     private Map<Long, MpVisitor> loadVisitorProfileMap(List<AppointmentVisitor> visitors) {
         if (visitors == null || visitors.isEmpty()) {
             return Map.of();

--
Gitblit v1.7.1