dingdanquanliucheng/frontend/mini-app/utils/subscribe.js

167 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 微信订阅消息授权工具
* 负责在关键操作前请求用户授权订阅消息,实现提醒推送。
*/
// 微信公众平台配置的模板ID与后端 .env 配置保持一致)
var TEMPLATE_IDS = {
// 订单状态变更通知
order_status_change: "TkCDtUd1d2MPzMMy_QwvaoHxvweBY-uA9p3jk3nsKi0",
// 订单待审批通知
order_approval_needed: "xNlOt-_6jMTh5VKf9F_pX4aMtwpjXZKUBBTp8QtzTag",
// 物流任务分配通知
task_assigned: "uzivHUxL1A3cBguMvC6HDO4aXqvmCV8X3o538SpDEX4",
// 物流超时提醒
logistics_timeout: "1NtPbIS_LtmsJhl4V4V3poWO_EZYYFNbKoLzO1TLTDc",
// 欠款提醒
arrears: "ulYRf4HgTXNWYSqT0KYVKJiHnG19_12tjcDXMYD2kHo",
// 客户沉默提醒
inactive_customer: "pWYFYbZNJvnOGD-4ycNf8zxmseIiuogFAXa9biVscBc",
};
var CONFIG_KEY_TO_TEMPLATE_TYPE = {
wechat_template_order_status: "order_status_change",
wechat_template_approval: "order_approval_needed",
wechat_template_task_assigned: "task_assigned",
wechat_template_logistics_timeout: "logistics_timeout",
wechat_template_arrears: "arrears",
wechat_template_inactive_customer: "inactive_customer",
};
/**
* 设置模板ID在 app.js 或配置文件中调用)
* @param {Object} ids - 模板ID映射
*/
function setTemplateIds(ids) {
Object.assign(TEMPLATE_IDS, ids);
}
function applyConfigItems(configItems) {
var ids = {};
(configItems || []).forEach(function (item) {
var templateType = CONFIG_KEY_TO_TEMPLATE_TYPE[item.config_key];
if (templateType && item.config_value) {
ids[templateType] = item.config_value;
}
});
setTemplateIds(ids);
}
/**
* 请求订阅消息授权
* @param {string[]} tmplIds - 模板ID数组
* @returns {Promise<Object>} 授权结果
*/
function requestSubscribe(tmplIds) {
// 过滤空的模板ID
var validIds = tmplIds.filter(function (id) {
return id && id.length > 0;
});
if (validIds.length === 0) {
return Promise.resolve({});
}
return new Promise(function (resolve) {
wx.requestSubscribeMessage({
tmplIds: validIds,
success: function (res) {
console.log("[Subscribe] 授权结果:", res);
resolve(res);
},
fail: function (err) {
console.warn("[Subscribe] 授权失败:", err);
resolve({});
},
});
});
}
/**
* 获取操作对应的模板ID列表
* @param {string} action - 操作类型
* @returns {string[]} 模板ID数组
*/
function getTemplateIdsForAction(action) {
var mapping = {
// 创建订单 -> 通知管理层审批
create_order: ["order_approval_needed"],
// 审批操作 -> 通知业务员
approve: ["order_status_change"],
// 接单 -> 订单状态变更通知
accept_task: ["order_status_change"],
// 揽货 -> 订单状态变更通知
pickup_task: ["order_status_change"],
// 送达 -> 订单状态变更通知
deliver_task: ["order_status_change"],
// 分配任务 -> 通知司机
assign_task: ["task_assigned"],
// 通用登录 -> 接收所有类型通知
login: [
"order_status_change",
"order_approval_needed",
"task_assigned",
"logistics_timeout",
"arrears",
],
};
return mapping[action] || [];
}
/**
* 在关键操作前确保已授权订阅消息
* @param {string} action - 操作类型
* @returns {Promise<void>}
*/
async function ensureSubscribePermission(action) {
var tmplIds = getTemplateIdsForAction(action);
if (tmplIds.length === 0) {
return;
}
try {
// 检查订阅消息总开关
var setting = await new Promise(function (resolve) {
wx.getSetting({
success: function (res) {
resolve(res);
},
fail: function () {
resolve({});
},
});
});
var subscriptionsSetting = setting.subscriptionsSetting || {};
// 如果总开关已关闭,提示用户开启
if (subscriptionsSetting.mainSwitch === false) {
console.log("[Subscribe] 订阅消息总开关已关闭");
return;
}
// 检查是否已有授权
var itemSettings = subscriptionsSetting.itemSettings || {};
var needRequest = tmplIds.some(function (id) {
return !itemSettings[id] || itemSettings[id] === "reject";
});
if (needRequest) {
await requestSubscribe(tmplIds);
}
} catch (e) {
console.warn("[Subscribe] 检查授权状态失败:", e);
// 降级:直接请求授权
await requestSubscribe(tmplIds);
}
}
module.exports = {
setTemplateIds: setTemplateIds,
applyConfigItems: applyConfigItems,
requestSubscribe: requestSubscribe,
getTemplateIdsForAction: getTemplateIdsForAction,
ensureSubscribePermission: ensureSubscribePermission,
};