ykt-team-wxapp/utils/subscribe-message.js

195 lines
5.5 KiB
JavaScript
Raw Normal View History

2026-04-16 11:22:27 +08:00
import api from "@/utils/api";
import { toast } from "@/utils/widget";
import { resolveSubscribeTemplates } from "./subscribe-message-config";
const SUBSCRIBE_ACCEPT_STATUS = "accept";
const SUBSCRIBE_REJECT_STATUS = "reject";
const SUBSCRIBE_BAN_STATUS = "ban";
const SUBSCRIBE_FILTER_STATUS = "filter";
const SUBSCRIBE_CANCEL_STATUS = "cancel";
const SUBSCRIBE_FAILED_STATUS = "failed";
function canUseSubscribeMessage() {
return (
typeof wx !== "undefined" &&
typeof wx.requestSubscribeMessage === "function"
);
}
function requestSubscribeMessage(tmplIds = []) {
return new Promise((resolve) => {
wx.requestSubscribeMessage({
tmplIds,
success(res) {
resolve({ ok: true, res });
},
fail(err) {
resolve({ ok: false, err });
},
});
});
}
function normalizeFailStatus(err = {}) {
const errCode = Number(err.errCode || 0);
const errMsg = String(err.errMsg || "").toLowerCase();
if (errCode === 20004 || errMsg.includes("main switch")) {
return SUBSCRIBE_BAN_STATUS;
}
if (errCode === 20005 || errMsg.includes("ban")) {
return SUBSCRIBE_BAN_STATUS;
}
if (errMsg.includes("filter")) {
return SUBSCRIBE_FILTER_STATUS;
}
if (errMsg.includes("cancel")) {
return SUBSCRIBE_CANCEL_STATUS;
}
return SUBSCRIBE_FAILED_STATUS;
}
function buildTemplateResultRecords(templates = [], requestResult = {}, context = {}) {
const requestedAt = Date.now();
if (requestResult.ok) {
const res = requestResult.res || {};
return templates.map((template) => ({
role: context.role || "",
scene: context.scene || "",
conversationId: context.conversationId || "",
groupId: context.groupId || "",
corpId: context.corpId || "",
teamId: context.teamId || "",
patientId: context.patientId || "",
doctorId: context.doctorId || "",
userId: context.userId || "",
openid: context.openid || "",
unionid: context.unionid || "",
templateId: template.id,
templateCode: template.code,
templateName: template.name,
eventTypes: template.events,
status: String(res[template.id] || SUBSCRIBE_FAILED_STATUS),
rawResult: res,
requestedAt,
extraData: context.extraData || {},
}));
}
const status = normalizeFailStatus(requestResult.err);
return templates.map((template) => ({
role: context.role || "",
scene: context.scene || "",
conversationId: context.conversationId || "",
groupId: context.groupId || "",
corpId: context.corpId || "",
teamId: context.teamId || "",
patientId: context.patientId || "",
doctorId: context.doctorId || "",
userId: context.userId || "",
openid: context.openid || "",
unionid: context.unionid || "",
templateId: template.id,
templateCode: template.code,
templateName: template.name,
eventTypes: template.events,
status,
rawResult: requestResult.err || {},
requestedAt,
extraData: context.extraData || {},
}));
}
function buildToastMessage(records = [], reportResult = { success: false }) {
const accepted = records.some((item) => item.status === SUBSCRIBE_ACCEPT_STATUS);
if (accepted && reportResult?.success === false) {
return reportResult?.message || "提醒开启失败,请稍后再试";
}
if (records.some((item) => item.status === SUBSCRIBE_ACCEPT_STATUS)) {
return "会话消息提醒开启";
}
if (records.some((item) => item.status === SUBSCRIBE_BAN_STATUS)) {
return "请先在微信设置中开启订阅消息提醒";
}
if (records.some((item) => item.status === SUBSCRIBE_FILTER_STATUS)) {
return "当前提醒模板暂不可用";
}
if (records.some((item) => item.status === SUBSCRIBE_REJECT_STATUS)) {
return "你已拒绝本次提醒订阅";
}
if (records.some((item) => item.status === SUBSCRIBE_CANCEL_STATUS)) {
return "你已取消本次提醒订阅";
}
return "提醒订阅请求失败,请稍后再试";
}
async function reportSubscribeResult(records = []) {
if (!records.length) return { success: false };
try {
return await api(
"saveConversationSubscribeResult",
{
records,
},
false
);
} catch (error) {
console.error("保存订阅结果失败:", error);
return { success: false, message: error?.message || "保存失败" };
}
}
export async function requestConversationSubscribeMessage(context = {}) {
const templates = resolveSubscribeTemplates({
role: context.role,
scene: context.scene,
});
const requestTemplates = templates.slice(0, 1);
if (!requestTemplates.length) {
await toast("暂未配置提醒模板");
return {
success: false,
code: "template_missing",
records: [],
};
}
if (!canUseSubscribeMessage()) {
await toast("当前微信版本不支持订阅消息");
return {
success: false,
code: "unsupported",
records: [],
};
}
const requestResult = await requestSubscribeMessage(
requestTemplates.map((item) => item.id)
);
const records = buildTemplateResultRecords(
requestTemplates,
requestResult,
context
);
const reportResult = await reportSubscribeResult(records);
await toast(buildToastMessage(records, reportResult));
const subscribeSuccess =
records.some((item) => item.status === SUBSCRIBE_ACCEPT_STATUS) &&
reportResult?.success !== false;
return {
success: subscribeSuccess,
reportResult,
records,
acceptedTemplateIds: records
.filter((item) => item.status === SUBSCRIBE_ACCEPT_STATUS)
.map((item) => item.templateId),
};
}