167 lines
4.6 KiB
JavaScript
167 lines
4.6 KiB
JavaScript
/**
|
||
* 微信订阅消息授权工具
|
||
* 负责在关键操作前请求用户授权订阅消息,实现提醒推送。
|
||
*/
|
||
|
||
// 微信公众平台配置的模板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,
|
||
};
|