Generating commit message...
This commit is contained in:
@@ -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行
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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.
Binary file not shown.
Binary file not shown.
@@ -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">
|
||||||
|
|||||||
Reference in New Issue
Block a user