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/MiniHandlerApprovalApplicationService.java |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 54 insertions(+), 0 deletions(-)

diff --git a/backend/src/main/java/com/sinata/appointment/service/MiniHandlerApprovalApplicationService.java b/backend/src/main/java/com/sinata/appointment/service/MiniHandlerApprovalApplicationService.java
index 64f730d..6eb5035 100644
--- a/backend/src/main/java/com/sinata/appointment/service/MiniHandlerApprovalApplicationService.java
+++ b/backend/src/main/java/com/sinata/appointment/service/MiniHandlerApprovalApplicationService.java
@@ -33,13 +33,16 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Stream;
 import java.util.stream.Collectors;
+import lombok.extern.slf4j.Slf4j;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import com.sinata.appointment.util.UuidAssert;
 
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class MiniHandlerApprovalApplicationService {
@@ -48,6 +51,7 @@
     private final ApprovalInstanceMapper approvalInstanceMapper;
     private final AppointmentOrderMapper appointmentOrderMapper;
     private final ApprovalEngineService approvalEngineService;
+    private final IntegrationWechatService integrationWechatService;
     private final PostApprovalOrchestrationService postApprovalOrchestrationService;
     private final BizApprovalNodeConfigMapper bizApprovalNodeConfigMapper;
     private final MpPassAccessAreaMapper mpPassAccessAreaMapper;
@@ -182,6 +186,14 @@
         if (ApprovalInstanceStatus.APPROVED.equals(latest.getStatus())) {
             AppointmentOrder fresh = appointmentOrderMapper.selectById(order.getId());
             postApprovalOrchestrationService.onOrderFullyApproved(fresh);
+            return;
+        }
+        if (ApprovalInstanceStatus.IN_PROGRESS.equals(latest.getStatus())) {
+            try {
+                integrationWechatService.notifyCurrentApprovers(order, latest.getId());
+            } catch (Exception ex) {
+                log.warn("notify current approvers failed, orderId={}", order.getId(), ex);
+            }
         }
     }
 
@@ -213,6 +225,7 @@
         }
 
         String comment = req.getComment() == null ? null : req.getComment().trim();
+        appendNoticeIdsIfNeeded(task, req.getNoticeIds());
         if (Boolean.FALSE.equals(req.getApprove())) {
             String reason = StringUtils.hasText(comment) ? comment : "拒绝";
             task.setTaskStatus(ApprovalTaskStatus.REJECTED);
@@ -233,10 +246,51 @@
             if (ApprovalInstanceStatus.APPROVED.equals(latest.getStatus())) {
                 AppointmentOrder fresh = appointmentOrderMapper.selectById(order.getId());
                 postApprovalOrchestrationService.onOrderFullyApproved(fresh);
+                return;
+            }
+            if (ApprovalInstanceStatus.IN_PROGRESS.equals(latest.getStatus())) {
+                try {
+                    integrationWechatService.notifyCurrentApprovers(order, latest.getId());
+                } catch (Exception ex) {
+                    log.warn("notify current approvers failed, orderId={}", order.getId(), ex);
+                }
             }
         }
     }
 
+    private void appendNoticeIdsIfNeeded(ApprovalTask task, List<Long> noticeIds) {
+        if (!ApprovalNodeCode.LEVEL3_LOCAL_DEPT_LEADER.equals(task.getNodeCode())) {
+            return;
+        }
+        List<Long> normalized = normalizeIds(noticeIds);
+        if (normalized.isEmpty()) {
+            return;
+        }
+        LinkedHashSet<Long> merged = new LinkedHashSet<>(parseNoticeIds(task.getNoticeIds()));
+        merged.addAll(normalized);
+        task.setNoticeIds(merged.stream().map(String::valueOf).collect(Collectors.joining(",")));
+    }
+
+    private List<Long> parseNoticeIds(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, AppointmentOrder> loadOrderMap(List<Long> orderIds) {
         if (orderIds.isEmpty()) {
             return Map.of();

--
Gitblit v1.7.1