feat(mp): 微信模板消息订阅统一封装

- 新增 requestSubscribe() 统一订阅函数,消除页面内类型断言重复
- 用药页面新增 requestSubscribeMessage 订阅(MEDICATION_REMINDER 模板)
- 告警页面改用 requestSubscribe('CRITICAL_HEALTH_ALERT')
- wechat-templates 新增 MEDICATION_REMINDER 模板 ID 环境变量
This commit is contained in:
iven
2026-05-22 12:08:49 +08:00
parent 0dfbe3130c
commit 22e33114b1
3 changed files with 26 additions and 9 deletions

View File

@@ -1,3 +1,5 @@
import Taro from '@tarojs/taro';
// 微信订阅消息模板 ID — 通过环境变量注入
// 注册路径:公众平台 → 功能 → 订阅消息 → 添加模板
// 环境变量TARO_APP_WX_TEMPLATE_APPOINTMENT / FOLLOWUP / REPORT / CRITICAL_ALERT / HEALTH_ABNORMAL
@@ -7,6 +9,7 @@ export const TEMPLATE_IDS = {
REPORT_NOTIFICATION: process.env.TARO_APP_WX_TEMPLATE_REPORT || '',
CRITICAL_HEALTH_ALERT: process.env.TARO_APP_WX_TEMPLATE_CRITICAL_ALERT || '',
HEALTH_DATA_ABNORMAL: process.env.TARO_APP_WX_TEMPLATE_HEALTH_ABNORMAL || '',
MEDICATION_REMINDER: process.env.TARO_APP_WX_TEMPLATE_MEDICATION || '',
} as const;
/** 检查模板 ID 是否已配置,未配置时返回 false 并打印警告 */
@@ -17,3 +20,15 @@ export function isTemplateConfigured(key: keyof typeof TEMPLATE_IDS): boolean {
}
return true;
}
/** 请求订阅消息授权,模板未配置时静默跳过 */
export async function requestSubscribe(...keys: (keyof typeof TEMPLATE_IDS)[]): Promise<void> {
const tmplIds = keys.map((k) => TEMPLATE_IDS[k]).filter(Boolean);
if (tmplIds.length === 0) return;
try {
await (Taro as unknown as { requestSubscribeMessage: (o: { tmplIds: string[] }) => Promise<unknown> })
.requestSubscribeMessage({ tmplIds });
} catch {
// 用户拒绝或已订阅,不阻塞页面
}
}