diff --git a/admin/arco-design-pro-vite/src/views/safety/platform-config/index.vue b/admin/arco-design-pro-vite/src/views/safety/platform-config/index.vue
index 554591d..0fdde4e 100644
--- a/admin/arco-design-pro-vite/src/views/safety/platform-config/index.vue
+++ b/admin/arco-design-pro-vite/src/views/safety/platform-config/index.vue
@@ -660,6 +660,13 @@
拉取小程序模板列表(核对ID)
+
+ 一键按标题填入槽位
+
@@ -690,6 +697,11 @@
+
+
+ 填入
+
+
@@ -1413,6 +1425,45 @@ const mismatchedTemplateIds = computed(() => {
return t.mismatched.map((m: any) => `${m.key}: ${m.templateId}`);
});
+// 按模板标题推断应填入的后台槽位,避免手抄长ID出错
+const resolveSlotByTitle = (title: string): string => {
+ const t = String(title || '');
+ if (/订单/.test(t)) return 'orderStatusTemplateId';
+ if (/提现/.test(t)) return 'withdrawSuccessTemplateId';
+ if (/活动|报名|组局|搭子/.test(t)) return 'activityJoinTemplateId';
+ if (/核销|签到/.test(t)) return 'verifyCodeTemplateId';
+ return '';
+};
+
+const applyOneTemplate = (record: any) => {
+ const slot = resolveSlotByTitle(record?.title);
+ const id = String(record?.templateId || '');
+ if (!slot || !id) {
+ Message.warning('无法按标题判断槽位,请手动复制该模板ID');
+ return;
+ }
+ (messageTemplateForm.valueJson as any)[slot] = id;
+ Message.success('已填入对应槽位,请点「保存微信模板消息配置」落库');
+};
+
+const applyWechatTemplates = () => {
+ const t = wechatTemplates.value;
+ if (!t || !Array.isArray(t.templates)) return;
+ let filled = 0;
+ for (const tpl of t.templates) {
+ const slot = resolveSlotByTitle(tpl?.title);
+ if (slot && tpl?.templateId) {
+ (messageTemplateForm.valueJson as any)[slot] = String(tpl.templateId);
+ filled += 1;
+ }
+ }
+ if (filled > 0) {
+ Message.success(`已按标题填入 ${filled} 个模板ID,请点「保存微信模板消息配置」落库`);
+ } else {
+ Message.warning('未能按标题自动匹配,请手动复制列表中的模板ID');
+ }
+};
+
const saveMessageTemplateConfig = () => {
saveConfig('message_template_rules', messageTemplateForm);
diff --git a/server/tests/subscription-message-diagnose.spec.ts b/server/tests/subscription-message-diagnose.spec.ts
index 2cf4116..956023e 100644
--- a/server/tests/subscription-message-diagnose.spec.ts
+++ b/server/tests/subscription-message-diagnose.spec.ts
@@ -56,6 +56,12 @@ describe('第七十批订阅消息原因可见与真实授权', () => {
expect(indexCode).toContain('const normId = (v: any)');
});
+ it('提供「一键填入槽位」,避免手抄长模板ID出错', () => {
+ expect(adminCode).toContain('applyWechatTemplates');
+ expect(adminCode).toContain('resolveSlotByTitle');
+ expect(adminCode).toContain('applyOneTemplate');
+ });
+
it('小程序真正调用订阅授权并过滤占位符', () => {
expect(subscribeCode).toContain('requestSubscribeAll');
expect(subscribeCode).toContain("startsWith('tmpl_')");