From e45e74e5ae207f7642be9a88ed99b593de89fb3b Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期三, 24 六月 2026 16:54:46 +0800
Subject: [PATCH] 1.0

---
 backend/src/main/java/com/sinata/appointment/service/IntegrationWechatService.java |   65 ++++++++++++++++++++++----------
 1 files changed, 44 insertions(+), 21 deletions(-)

diff --git a/backend/src/main/java/com/sinata/appointment/service/IntegrationWechatService.java b/backend/src/main/java/com/sinata/appointment/service/IntegrationWechatService.java
index 0b65f91..940cdec 100644
--- a/backend/src/main/java/com/sinata/appointment/service/IntegrationWechatService.java
+++ b/backend/src/main/java/com/sinata/appointment/service/IntegrationWechatService.java
@@ -6,11 +6,13 @@
 import com.sinata.appointment.constants.ApprovalNodeCode;
 import com.sinata.appointment.constants.ApprovalTaskStatus;
 import com.sinata.appointment.entity.ApprovalTask;
+import com.sinata.appointment.entity.AppointmentVisitor;
 import com.sinata.appointment.entity.AppointmentOrder;
 import com.sinata.appointment.entity.BizVisitReason;
 import com.sinata.appointment.entity.MpUser;
 import com.sinata.appointment.integration.WechatMiniGateway;
 import com.sinata.appointment.mapper.ApprovalTaskMapper;
+import com.sinata.appointment.mapper.AppointmentVisitorMapper;
 import com.sinata.appointment.mapper.BizVisitReasonMapper;
 import com.sinata.appointment.mapper.MpUserMapper;
 import java.time.LocalDate;
@@ -32,12 +34,12 @@
 public class IntegrationWechatService {
 
     private static final String APPROVAL_RESULT_TEMPLATE_ID =
-            "4FQovCBNFM7rth42AWHTusHajO788eT9VpplSN4ZG2s";
+            "rIJpfN51_q818RTpJAqTe5ssTwWCHnxDM5rpq64uuKM";
     private static final String NOTICE_RESULT_TEMPLATE_ID =
-            "GC1S3T2qHCbz8ow130u7elRczuqW6Z8q54mKRCYE-xo";
+            "Wip0ODJgybZpeFpcvev_0GK1wQXEqZw-LHOjS-UyDLw";
     private static final String APPROVAL_RESULT_PAGE = "pages/record/index";
     private static final String APPROVAL_TODO_TEMPLATE_ID =
-            "BX49OBHvRcoYiCw0ZLqx04BiWQ9KaEQwuVth_Lh_M2A";
+            "QlNwG99WXWztRDgtlLcE0fHxfY2VwaX8PRMrwGpEync";
     private static final String APPROVAL_TODO_PAGE = "pages/reviewList/index";
     private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
     private static final DateTimeFormatter TEMPLATE_TIME_FORMATTER =
@@ -46,6 +48,7 @@
     private final WechatMiniGateway wechatMiniGateway;
     private final MpUserMapper mpUserMapper;
     private final ApprovalTaskMapper approvalTaskMapper;
+    private final AppointmentVisitorMapper appointmentVisitorMapper;
     private final BizVisitReasonMapper bizVisitReasonMapper;
 
     @Async
@@ -70,10 +73,9 @@
                 return;
             }
             Map<String, String> templateData = new LinkedHashMap<>();
-            templateData.put("thing1", approved ? "审核通过" : "审核未通过");
-            templateData.put("thing2", abbreviate(resolveSubmitterName(submitter), 20));
-            templateData.put("time3", buildVisitTemplateTimeValue(order));
-            templateData.put("thing4", abbreviate(buildVisitReasonText(order), 20));
+            templateData.put("phrase4", approved ? "通过" : "未通过");
+            templateData.put("time2", buildVisitTemplateTimeValue(order));
+            templateData.put("thing5", approved ? "预约审核通过" : "预约审核未通过");
             wechatMiniGateway.sendSubscribeMessage(
                     submitter.getOpenId(), APPROVAL_RESULT_TEMPLATE_ID, APPROVAL_RESULT_PAGE, templateData);
             log.info(
@@ -97,9 +99,10 @@
                 return;
             }
             Map<String, String> templateData = new LinkedHashMap<>();
-            templateData.put("thing6", buildVisitorCountText(visitorCount));
-            templateData.put("time18", buildVisitTemplateTimeValue(order));
-            templateData.put("thing20", abbreviate(buildNoticeBusinessTypeText(order, approved), 20));
+            MpUser submitter = loadSubmitter(order);
+            templateData.put("name1", abbreviate(resolveSubmitterName(submitter), 10));
+            templateData.put("number36", buildVisitorCountNumber(visitorCount));
+            templateData.put("date3", buildVisitTemplateTimeValue(order));
             int successCount = 0;
             int skippedCount = 0;
             int failedCount = 0;
@@ -184,8 +187,11 @@
                     continue;
                 }
                 Map<String, String> templateData = new LinkedHashMap<>();
-                templateData.put("thing1", abbreviate(buildTodoTaskName(order), 20));
-                templateData.put("thing3", abbreviate(String.join("、", entry.getValue()), 20));
+                MpUser submitter = loadSubmitter(order);
+                templateData.put("name1", abbreviate(resolveSubmitterName(submitter), 10));
+                templateData.put("number15", buildVisitorCountNumber(countVisitors(order)));
+                templateData.put("time16", buildVisitTemplateTimeValue(order));
+                templateData.put("thing5", abbreviate(buildVisitReasonText(order), 20));
                 try {
                     wechatMiniGateway.sendSubscribeMessage(
                             user.getOpenId(), APPROVAL_TODO_TEMPLATE_ID, APPROVAL_TODO_PAGE, templateData);
@@ -210,6 +216,9 @@
     }
 
     private String resolveSubmitterName(MpUser submitter) {
+        if (submitter == null) {
+            return "预约人";
+        }
         if (StringUtils.hasText(submitter.getNickName())) {
             return submitter.getNickName().trim();
         }
@@ -217,6 +226,17 @@
             return submitter.getMobile().trim();
         }
         return "预约人";
+    }
+
+    private MpUser loadSubmitter(AppointmentOrder order) {
+        if (order == null || order.getSubmitterId() == null) {
+            return null;
+        }
+        return mpUserMapper.selectOne(
+                new LambdaQueryWrapper<MpUser>()
+                        .eq(MpUser::getDelFlag, 0)
+                        .eq(MpUser::getId, order.getSubmitterId())
+                        .last("limit 1"));
     }
 
     private String buildVisitTimeText(AppointmentOrder order) {
@@ -262,8 +282,7 @@
             return "拜访";
         }
         if (AppointmentBizConstants.VISIT_REASON_OTHER.equalsIgnoreCase(reasonCode)) {
-            String other = safeTrim(order.getVisitReasonOther());
-            return StringUtils.hasText(other) ? "其他:" + other : "其他";
+            return "其他";
         }
         BizVisitReason reason =
                 bizVisitReasonMapper.selectOne(
@@ -277,16 +296,20 @@
         return reasonCode;
     }
 
-    private String buildVisitorCountText(int visitorCount) {
-        return Math.max(visitorCount, 0) + "人";
+    private String buildVisitorCountNumber(int visitorCount) {
+        return String.valueOf(Math.max(visitorCount, 0));
     }
 
-    private String buildNoticeBusinessTypeText(AppointmentOrder order, boolean approved) {
-        String reason = buildVisitReasonText(order);
-        if (!StringUtils.hasText(reason)) {
-            return approved ? "预约通过" : "预约驳回";
+    private int countVisitors(AppointmentOrder order) {
+        if (order == null || order.getId() == null) {
+            return 0;
         }
-        return reason;
+        Long count =
+                appointmentVisitorMapper.selectCount(
+                        new LambdaQueryWrapper<AppointmentVisitor>()
+                                .eq(AppointmentVisitor::getDelFlag, 0)
+                                .eq(AppointmentVisitor::getOrderId, order.getId()));
+        return count == null ? 0 : count.intValue();
     }
 
     private String buildTodoTaskName(AppointmentOrder order) {

--
Gitblit v1.7.1