Generating commit message...

This commit is contained in:
ws
2026-04-22 10:12:12 +08:00
parent 254a317ff9
commit 95d08a7257
9 changed files with 43 additions and 56 deletions
@@ -24,4 +24,5 @@ public class VisitApplication {
private String statusText;
private String openid;
private String createTime;
private String spNo;
}
@@ -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;
@@ -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<String, Object> applyData = buildApplyData(visitorName, visitorPhone, visitorCompany,
visitPurpose, visitTime, visiteeName, visitArea);
// 构建审批流程(use_template_approver=0 时必填)
Map<String, Object> process = buildProcess(approverUserId);
// 构建摘要信息
List<Map<String, Object>> summaryList = buildSummaryList(visitorName, visitPurpose);
// 构建完整的审批请求体
// 构建完整的审批请求体use_template_approver=1 使用模板中配置的审批流程)
Map<String, Object> 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<String, Object> buildProcess(String approverUserId) {
List<Map<String, Object>> nodeList = List.of(
Map.of(
"type", 1,
"apv_rel", 1,
"userid", List.of(approverUserId)
)
);
return Map.of("node_list", nodeList);
}
/**
* 构建摘要信息,显示在审批通知卡片和审批列表中,最多3行
*/
+2
View File
@@ -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:
Binary file not shown.
-19
View File
@@ -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');
@@ -16,6 +16,7 @@
<result column="status_text" property="statusText"/>
<result column="openid" property="openid"/>
<result column="create_time" property="createTime"/>
<result column="sp_no" property="spNo"/>
</resultMap>
<sql id="Base_Column_List">
@@ -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
</sql>
<select id="selectLatestByOpenid" resultMap="BaseResultMap">
@@ -50,10 +52,10 @@
<insert id="insert">
INSERT INTO visit_application (id, name, phone, company, reason,
visit_date, visit_time, host_name, area,
status, status_text, openid, create_time)
status, status_text, openid, create_time, sp_no)
VALUES (#{id}, #{name}, #{phone}, #{company}, #{reason},
#{visitDate}, #{visitTime}, #{hostName}, #{area},
#{status}, #{statusText}, #{openid}, NOW())
#{status}, #{statusText}, #{openid}, NOW(), #{spNo})
</insert>
<update id="updateStatusToCancelled">