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 statusText;
private String openid; private String openid;
private String createTime; 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 com.example.mini_program.mapper.VisitApplicationMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@@ -15,6 +16,10 @@ import java.util.UUID;
public class AppointmentService { public class AppointmentService {
private final VisitApplicationMapper visitApplicationMapper; private final VisitApplicationMapper visitApplicationMapper;
private final WxApprovalService wxApprovalService;
@Value("${wx.corp.creator-userid:}")
private String creatorUserId;
/** /**
* 根据openid获取最新的一条预约记录 * 根据openid获取最新的一条预约记录
@@ -47,6 +52,29 @@ public class AppointmentService {
record.setId(UUID.randomUUID().toString().replace("-", "")); record.setId(UUID.randomUUID().toString().replace("-", ""));
record.setStatus("pending"); record.setStatus("pending");
record.setStatusText("待审核"); 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); visitApplicationMapper.insert(record);
log.info("创建预约记录成功, id: {}, openid: {}", record.getId(), record.getOpenid()); log.info("创建预约记录成功, id: {}, openid: {}", record.getId(), record.getOpenid());
return record; return record;
@@ -51,9 +51,9 @@ public class WxApprovalService {
} }
/** /**
* 提交审批申请 * 提交审批申请(使用模板中配置的审批流程)
* *
* @param approverUserId 审批人用户ID * @param creatorUserId 申请人用户ID
* @param visitorName 访客姓名 * @param visitorName 访客姓名
* @param visitorPhone 访客电话 * @param visitorPhone 访客电话
* @param visitorCompany 访客公司(可选) * @param visitorCompany 访客公司(可选)
@@ -61,13 +61,11 @@ public class WxApprovalService {
* @param visitTime 日期+时间 * @param visitTime 日期+时间
* @param visiteeName 被访人(可选) * @param visiteeName 被访人(可选)
* @param visitArea 拜访区域(可选) * @param visitArea 拜访区域(可选)
* @param applicantUserId 申请人用户ID(可选,用于追踪)
* @return 审批单号 * @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 visitorCompany, String visitPurpose, String visitTime,
String visiteeName, String visitArea, String visiteeName, String visitArea) {
String applicantUserId) {
String accessToken = getAccessToken(); String accessToken = getAccessToken();
String url = String.format(SUBMIT_APPROVAL_URL, accessToken); String url = String.format(SUBMIT_APPROVAL_URL, accessToken);
@@ -75,19 +73,15 @@ public class WxApprovalService {
Map<String, Object> applyData = buildApplyData(visitorName, visitorPhone, visitorCompany, Map<String, Object> applyData = buildApplyData(visitorName, visitorPhone, visitorCompany,
visitPurpose, visitTime, visiteeName, visitArea); visitPurpose, visitTime, visiteeName, visitArea);
// 构建审批流程(use_template_approver=0 时必填)
Map<String, Object> process = buildProcess(approverUserId);
// 构建摘要信息 // 构建摘要信息
List<Map<String, Object>> summaryList = buildSummaryList(visitorName, visitPurpose); List<Map<String, Object>> summaryList = buildSummaryList(visitorName, visitPurpose);
// 构建完整的审批请求体 // 构建完整的审批请求体use_template_approver=1 使用模板中配置的审批流程)
Map<String, Object> requestBody = new HashMap<>(); 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("template_id", wxCorpConfig.getApprovalTemplateId());
requestBody.put("use_template_approver", 0); requestBody.put("use_template_approver", 1);
requestBody.put("apply_data", applyData); requestBody.put("apply_data", applyData);
requestBody.put("process", process);
requestBody.put("summary_list", summaryList); requestBody.put("summary_list", summaryList);
log.info("提交审批申请, visitorName: {}, visitorPhone: {}", visitorName, visitorPhone); 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行 * 构建摘要信息,显示在审批通知卡片和审批列表中,最多3行
*/ */
+2
View File
@@ -25,6 +25,8 @@ wx:
approval-template-id: C4ej9uEntM19iNJbrtJsUqZakPFfjBNTPNLSKPno2 approval-template-id: C4ej9uEntM19iNJbrtJsUqZakPFfjBNTPNLSKPno2
# 审批回调URL(可选) # 审批回调URL(可选)
callback-url: http://your-domain.com/api/wx-corp/approval-callback callback-url: http://your-domain.com/api/wx-corp/approval-callback
# 审批申请人用户ID(提交审批的企微用户)
creator-userid: i
# MyBatis配置 # MyBatis配置
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="status_text" property="statusText"/>
<result column="openid" property="openid"/> <result column="openid" property="openid"/>
<result column="create_time" property="createTime"/> <result column="create_time" property="createTime"/>
<result column="sp_no" property="spNo"/>
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
@@ -23,7 +24,8 @@
DATE_FORMAT(visit_date, '%Y-%m-%d') AS visit_date, DATE_FORMAT(visit_date, '%Y-%m-%d') AS visit_date,
DATE_FORMAT(visit_time, '%H:%i') AS visit_time, DATE_FORMAT(visit_time, '%H:%i') AS visit_time,
host_name, area, status, status_text, openid, 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> </sql>
<select id="selectLatestByOpenid" resultMap="BaseResultMap"> <select id="selectLatestByOpenid" resultMap="BaseResultMap">
@@ -50,10 +52,10 @@
<insert id="insert"> <insert id="insert">
INSERT INTO visit_application (id, name, phone, company, reason, INSERT INTO visit_application (id, name, phone, company, reason,
visit_date, visit_time, host_name, area, 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}, VALUES (#{id}, #{name}, #{phone}, #{company}, #{reason},
#{visitDate}, #{visitTime}, #{hostName}, #{area}, #{visitDate}, #{visitTime}, #{hostName}, #{area},
#{status}, #{statusText}, #{openid}, NOW()) #{status}, #{statusText}, #{openid}, NOW(), #{spNo})
</insert> </insert>
<update id="updateStatusToCancelled"> <update id="updateStatusToCancelled">