From 95d08a72573fd90dda2533bf8e3460e04e12ac6b Mon Sep 17 00:00:00 2001 From: ws Date: Wed, 22 Apr 2026 10:12:12 +0800 Subject: [PATCH] Generating commit message... --- .../mini_program/entity/VisitApplication.java | 1 + .../service/AppointmentService.java | 28 ++++++++++++ .../service/WxApprovalService.java | 41 +++--------------- src/main/resources/application.yml | 2 + src/main/resources/data/data.sql | Bin 6546 -> 0 bytes .../data/database_export-3wUktapIrwxg.json | Bin 2590 -> 0 bytes .../data/database_export-STEP_NEQozdm.json | Bin 1502 -> 0 bytes src/main/resources/data/user.sql | 19 -------- .../mapper/VisitApplicationMapper.xml | 8 ++-- 9 files changed, 43 insertions(+), 56 deletions(-) delete mode 100644 src/main/resources/data/database_export-3wUktapIrwxg.json delete mode 100644 src/main/resources/data/database_export-STEP_NEQozdm.json delete mode 100644 src/main/resources/data/user.sql diff --git a/src/main/java/com/example/mini_program/entity/VisitApplication.java b/src/main/java/com/example/mini_program/entity/VisitApplication.java index f4191a0..eae1144 100644 --- a/src/main/java/com/example/mini_program/entity/VisitApplication.java +++ b/src/main/java/com/example/mini_program/entity/VisitApplication.java @@ -24,4 +24,5 @@ public class VisitApplication { private String statusText; private String openid; private String createTime; + private String spNo; } diff --git a/src/main/java/com/example/mini_program/service/AppointmentService.java b/src/main/java/com/example/mini_program/service/AppointmentService.java index 2140b66..d362d61 100644 --- a/src/main/java/com/example/mini_program/service/AppointmentService.java +++ b/src/main/java/com/example/mini_program/service/AppointmentService.java @@ -4,6 +4,7 @@ import com.example.mini_program.entity.VisitApplication; import com.example.mini_program.mapper.VisitApplicationMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.List; @@ -15,6 +16,10 @@ import java.util.UUID; public class AppointmentService { private final VisitApplicationMapper visitApplicationMapper; + private final WxApprovalService wxApprovalService; + + @Value("${wx.corp.creator-userid:}") + private String creatorUserId; /** * 根据openid获取最新的一条预约记录 @@ -47,6 +52,29 @@ public class AppointmentService { record.setId(UUID.randomUUID().toString().replace("-", "")); record.setStatus("pending"); record.setStatusText("待审核"); + + // 发起企业微信审批 + try { + String visitTime = record.getVisitDate(); + if (record.getVisitTime() != null && !record.getVisitTime().isEmpty()) { + visitTime = record.getVisitDate() + " " + record.getVisitTime(); + } + String spNo = wxApprovalService.submitApproval( + creatorUserId, + record.getName(), + record.getPhone(), + record.getCompany(), + record.getReason(), + visitTime, + record.getHostName(), + record.getArea() + ); + record.setSpNo(spNo); + log.info("企业微信审批提交成功, spNo: {}", spNo); + } catch (Exception e) { + log.error("企业微信审批提交失败,预约记录仍会保存", e); + } + visitApplicationMapper.insert(record); log.info("创建预约记录成功, id: {}, openid: {}", record.getId(), record.getOpenid()); return record; diff --git a/src/main/java/com/example/mini_program/service/WxApprovalService.java b/src/main/java/com/example/mini_program/service/WxApprovalService.java index 54377ce..97f534d 100644 --- a/src/main/java/com/example/mini_program/service/WxApprovalService.java +++ b/src/main/java/com/example/mini_program/service/WxApprovalService.java @@ -51,9 +51,9 @@ public class WxApprovalService { } /** - * 提交审批申请 + * 提交审批申请(使用模板中配置的审批流程) * - * @param approverUserId 审批人用户ID + * @param creatorUserId 申请人用户ID * @param visitorName 访客姓名 * @param visitorPhone 访客电话 * @param visitorCompany 访客公司(可选) @@ -61,13 +61,11 @@ public class WxApprovalService { * @param visitTime 日期+时间 * @param visiteeName 被访人(可选) * @param visitArea 拜访区域(可选) - * @param applicantUserId 申请人用户ID(可选,用于追踪) * @return 审批单号 */ - public String submitApproval(String approverUserId, String visitorName, String visitorPhone, + public String submitApproval(String creatorUserId, String visitorName, String visitorPhone, String visitorCompany, String visitPurpose, String visitTime, - String visiteeName, String visitArea, - String applicantUserId) { + String visiteeName, String visitArea) { String accessToken = getAccessToken(); String url = String.format(SUBMIT_APPROVAL_URL, accessToken); @@ -75,19 +73,15 @@ public class WxApprovalService { Map applyData = buildApplyData(visitorName, visitorPhone, visitorCompany, visitPurpose, visitTime, visiteeName, visitArea); - // 构建审批流程(use_template_approver=0 时必填) - Map process = buildProcess(approverUserId); - // 构建摘要信息 List> summaryList = buildSummaryList(visitorName, visitPurpose); - // 构建完整的审批请求体 + // 构建完整的审批请求体(use_template_approver=1 使用模板中配置的审批流程) Map requestBody = new HashMap<>(); - requestBody.put("creator_userid", applicantUserId != null ? applicantUserId : approverUserId); + requestBody.put("creator_userid", creatorUserId); requestBody.put("template_id", wxCorpConfig.getApprovalTemplateId()); - requestBody.put("use_template_approver", 0); + requestBody.put("use_template_approver", 1); requestBody.put("apply_data", applyData); - requestBody.put("process", process); requestBody.put("summary_list", summaryList); log.info("提交审批申请, visitorName: {}, visitorPhone: {}", visitorName, visitorPhone); @@ -184,27 +178,6 @@ public class WxApprovalService { ); } - /** - * 构建审批流程 - * use_template_approver=0 时必填 - * node_list: 流程节点列表 - * type: 1-审批人 2-抄送人 3-办理人 - * apv_rel: 多人审批方式 1-会签 2-或签 3-依次审批 - * userid: 用户ID列表 - * - * @param approverUserId 审批人用户ID - */ - private Map buildProcess(String approverUserId) { - List> nodeList = List.of( - Map.of( - "type", 1, - "apv_rel", 1, - "userid", List.of(approverUserId) - ) - ); - return Map.of("node_list", nodeList); - } - /** * 构建摘要信息,显示在审批通知卡片和审批列表中,最多3行 */ diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 265d424..a4c56dd 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -25,6 +25,8 @@ wx: approval-template-id: C4ej9uEntM19iNJbrtJsUqZakPFfjBNTPNLSKPno2 # 审批回调URL(可选) callback-url: http://your-domain.com/api/wx-corp/approval-callback + # 审批申请人用户ID(提交审批的企微用户) + creator-userid: i # MyBatis配置 mybatis: diff --git a/src/main/resources/data/data.sql b/src/main/resources/data/data.sql index eabe11626326536becec25808bd08f5783ae6c61..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 6546 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 b88zRe1vD9o|D_(A{p686&M+@jg*6w1R0Pn zbYJ)MJ8N>hM%YdfGvOC&VzR2yM%3ZnRb*}M)Qp%DDe=fwT{WvparbY{r + @@ -23,7 +24,8 @@ DATE_FORMAT(visit_date, '%Y-%m-%d') AS visit_date, DATE_FORMAT(visit_time, '%H:%i') AS visit_time, host_name, area, status, status_text, openid, - DATE_FORMAT(create_time, '%Y-%m-%dT%H:%i:%s.000+00:00') AS create_time + DATE_FORMAT(create_time, '%Y-%m-%dT%H:%i:%s.000+00:00') AS create_time, + sp_no