feat: add subscribe message push and refactor HTTP layer

This commit is contained in:
ws
2026-04-22 17:49:44 +08:00
parent 25d7bc9b55
commit 4ac8fa20cb
8 changed files with 346 additions and 283 deletions
@@ -10,6 +10,10 @@ import org.springframework.stereotype.Service;
import java.util.List;
import java.util.UUID;
/**
* 访客预约服务
* 创建预约 → 提交企微审批 → 推送订阅消息通知
*/
@Slf4j
@Service
@RequiredArgsConstructor
@@ -17,118 +21,91 @@ public class AppointmentService {
private final VisitApplicationMapper visitApplicationMapper;
private final WxApprovalService wxApprovalService;
private final WxSubscribeMessageService wxSubscribeMessageService;
@Value("${wx.corp.creator-userid:}")
private String creatorUserId;
/**
* 根据openid获取最新的一条预约记录
*/
/** 根据openid获取最新一条预约 */
public VisitApplication getLatest(String openid) {
log.info("查询用户最新预约记录, openid: {}", openid);
VisitApplication result = visitApplicationMapper.selectLatestByOpenid(openid);
if (result != null) {
log.info("找到预约记录, id: {}", result.getId());
} else {
log.info("未找到预约记录");
}
return result;
return visitApplicationMapper.selectLatestByOpenid(openid);
}
/**
* 获取用户所有预约记录(按创建时间倒序)
*/
/** 获取用户所有预约记录(按创建时间倒序) */
public List<VisitApplication> getList(String openid) {
log.info("查询用户预约列表, openid: {}", openid);
List<VisitApplication> list = visitApplicationMapper.selectListByOpenid(openid);
log.info("查询到 {} 条预约记录", list.size());
return list;
return visitApplicationMapper.selectListByOpenid(openid);
}
/**
* 创建预约记录
*/
/** 创建预约记录 */
public VisitApplication create(VisitApplication record) {
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()
);
creatorUserId, record.getName(), record.getPhone(), record.getCompany(),
record.getReason(), formatVisitTime(record), record.getHostName(), record.getArea());
record.setSpNo(spNo);
log.info("企业微信审批提交成功, spNo: {}", spNo);
} catch (Exception e) {
log.error("业微信审批提交失败,预约记录仍会保存", e);
log.error("审批提交失败,预约仍会保存", e);
}
visitApplicationMapper.insert(record);
log.info("创建预约记录成功, id: {}, openid: {}", record.getId(), record.getOpenid());
log.info("创建预约成功, id={}", record.getId());
// 推送订阅消息
try {
wxSubscribeMessageService.sendSubscribeMessage(
record.getOpenid(), record.getName(), record.getReason(),
formatVisitTime(record), record.getArea(), "待审核");
} catch (Exception e) {
log.error("订阅消息推送失败", e);
}
return record;
}
/**
* 取消预约(仅pending状态可取消,需校验openid
*/
/** 取消预约(仅 pending 状态可取消) */
public boolean cancel(String id, String openid) {
log.info("取消预约, id: {}, openid: {}", id, openid);
VisitApplication existing = visitApplicationMapper.selectByIdAndOpenid(id, openid);
if (existing == null) {
log.warn("预约记录不存在或不属于该用户, id: {}, openid: {}", id, openid);
if (existing == null || !"pending".equals(existing.getStatus())) {
return false;
}
if (!"pending".equals(existing.getStatus())) {
log.warn("预约状态不允许取消, id: {}, status: {}", id, existing.getStatus());
return false;
}
int rows = visitApplicationMapper.updateStatusToCancelled(id, openid);
if (rows > 0) {
log.info("取消预约成功, id: {}", id);
return true;
}
log.warn("取消预约失败, id: {}", id);
return false;
return visitApplicationMapper.updateStatusToCancelled(id, openid) > 0;
}
/**
* 审批预约(通过/拒绝)
*/
/** 审批预约(通过/拒绝) */
public boolean approve(String id, String status) {
log.info("审批预约, id: {}, status: {}", id, status);
VisitApplication existing = visitApplicationMapper.selectById(id);
if (existing == null) {
log.warn("预约记录不存在, id: {}", id);
return false;
}
if (!"pending".equals(existing.getStatus())) {
log.warn("预约状态不允许审批, id: {}, currentStatus: {}", id, existing.getStatus());
if (existing == null || !"pending".equals(existing.getStatus())) {
return false;
}
String statusText = "approved".equals(status) ? "已通过" : "已拒绝";
int rows = visitApplicationMapper.updateStatus(id, status, statusText);
if (rows <= 0) {
log.warn("审批更新失败, id: {}", id);
if (visitApplicationMapper.updateStatus(id, status, statusText) <= 0) {
return false;
}
log.info("审批成功, id: {}, status: {}", id, statusText);
// 推送审批结果订阅消息
try {
wxSubscribeMessageService.sendSubscribeMessage(
existing.getOpenid(), existing.getName(), existing.getReason(),
formatVisitTime(existing), existing.getArea(), statusText);
} catch (Exception e) {
log.error("审批结果订阅消息推送失败", e);
}
return true;
}
/** 拼接访问日期+时间 */
private String formatVisitTime(VisitApplication record) {
String time = record.getVisitDate();
if (record.getVisitTime() != null && !record.getVisitTime().isEmpty()) {
time = record.getVisitDate() + " " + record.getVisitTime();
}
return time;
}
}