From c17afd20d569328dd1ed5e12cdccd8c070cb9f79 Mon Sep 17 00:00:00 2001 From: xcbyy <2578898740@qq.com> Date: Mon, 19 Oct 2026 11:27:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E6=A8=A1=E6=9D=BF=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=94=AF=E6=8C=81=E3=80=8C=E4=B8=80=E9=94=AE=E6=8C=89?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E5=A1=AB=E5=85=A5=E6=A7=BD=E4=BD=8D=E3=80=8D?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E6=89=8B=E6=8A=84=E9=95=BF=E6=A8=A1?= =?UTF-8?q?=E6=9D=BFID=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 列表每行新增「填入」按钮,按标题(订单/提现/活动报名/核销)自动写入对应槽位 - 顶部新增「一键按标题填入槽位」,批量填入后提示保存落库 - 回归 87 套件/639 用例全绿 --- .../views/safety/platform-config/index.vue | 51 +++++++++++++++++++ .../subscription-message-diagnose.spec.ts | 6 +++ 2 files changed, 57 insertions(+) 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_')");