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 eabe116..e69de29 100644 Binary files a/src/main/resources/data/data.sql and b/src/main/resources/data/data.sql differ diff --git a/src/main/resources/data/database_export-3wUktapIrwxg.json b/src/main/resources/data/database_export-3wUktapIrwxg.json deleted file mode 100644 index 8651d31..0000000 Binary files a/src/main/resources/data/database_export-3wUktapIrwxg.json and /dev/null differ diff --git a/src/main/resources/data/database_export-STEP_NEQozdm.json b/src/main/resources/data/database_export-STEP_NEQozdm.json deleted file mode 100644 index c318e3c..0000000 Binary files a/src/main/resources/data/database_export-STEP_NEQozdm.json and /dev/null differ diff --git a/src/main/resources/data/user.sql b/src/main/resources/data/user.sql deleted file mode 100644 index 0c5a6cb..0000000 --- a/src/main/resources/data/user.sql +++ /dev/null @@ -1,19 +0,0 @@ --- 微信用户表 -CREATE TABLE IF NOT EXISTS `wx_user` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `openid` varchar(64) NOT NULL COMMENT '微信用户openid', - `nickname` varchar(100) DEFAULT NULL COMMENT '用户昵称', - `avatar_url` varchar(500) DEFAULT NULL COMMENT '头像URL', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_openid` (`openid`), - KEY `idx_last_login` (`last_login_time`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信用户表'; - --- 插入用户数据 -INSERT INTO `wx_user` (`openid`, `nickname`, `avatar_url`, `create_time`, `last_login_time`) VALUES - ('ogzdF3d3Z494n28mxsUUHvASiePE', 'i', 'wxfile://tmp_087ba7d96bc1da49c25cf77a6c2b6a90f03fffddcc59aecf.png', '2026-04-18 16:26:24', '2026-04-20 17:47:25'), - ('ogzdF3Vv42nydiUnY6lEW0ufK4Q0', '23', 'http://tmp/q2RwR6L5kT1v2b4bd91956654d901dfa7b6cd59aa006.jpeg', '2026-04-18 16:32:42', '2026-04-20 16:42:43'), - ('ogzdF3a-l23Vfpq14b7QEp1VEukg', NULL, NULL, '2026-04-21 01:24:29', '2026-04-21 01:24:29'); - diff --git a/src/main/resources/mapper/VisitApplicationMapper.xml b/src/main/resources/mapper/VisitApplicationMapper.xml index cae9a87..96619ac 100644 --- a/src/main/resources/mapper/VisitApplicationMapper.xml +++ b/src/main/resources/mapper/VisitApplicationMapper.xml @@ -16,6 +16,7 @@ + @@ -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