From 1f3e580cf857db4d53eb93fde4e17023f3cc6e76 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 25 Aug 2026 09:34:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/src/api/first_visit.ts | 20 +- .../components/WecomFloatingWidgetBuilder.vue | 9 +- .../first_visit/wecom_promotion/index.vue | 642 ++++++++---------- admin/tsconfig.tsbuildinfo | 2 +- admin/vite.config.ts | 7 +- 5 files changed, 312 insertions(+), 368 deletions(-) diff --git a/admin/src/api/first_visit.ts b/admin/src/api/first_visit.ts index 7592d31d5..2787e34e4 100644 --- a/admin/src/api/first_visit.ts +++ b/admin/src/api/first_visit.ts @@ -190,9 +190,9 @@ export function wecomPromotionOverview() { return request.get({ url: '/firstvisit.wecomPromotion/overview' }) } -export function wecomPromotionSavePool(params: Record) { - return request.post({ url: '/firstvisit.wecomPromotion/savePool', params }) -} +export function wecomPromotionSavePool(params: Record) { + return request.post({ url: '/firstvisit.wecomPromotion/savePool', params, timeout: 120000 }) +} export function wecomPromotionSaveWidget(params: Record) { return request.post({ url: '/firstvisit.wecomPromotion/saveWidget', params }) @@ -202,9 +202,17 @@ export function wecomPromotionDeletePool(params: { id: number }) { return request.post({ url: '/firstvisit.wecomPromotion/deletePool', params }) } -export function wecomPromotionSaveLink(params: Record) { - return request.post({ url: '/firstvisit.wecomPromotion/saveLink', params }) -} +export function wecomPromotionSaveLink(params: Record) { + return request.post({ url: '/firstvisit.wecomPromotion/saveLink', params }) +} + +export function wecomPromotionSaveMember(params: Record) { + return request.post({ url: '/firstvisit.wecomPromotion/saveMember', params, timeout: 120000 }) +} + +export function wecomPromotionToggleMember(params: { id: number; status: number }) { + return request.post({ url: '/firstvisit.wecomPromotion/toggleMember', params, timeout: 120000 }) +} export function wecomPromotionCheckApiPermission() { return request.post({ url: '/firstvisit.wecomPromotion/checkApiPermission' }) diff --git a/admin/src/views/first_visit/wecom_promotion/components/WecomFloatingWidgetBuilder.vue b/admin/src/views/first_visit/wecom_promotion/components/WecomFloatingWidgetBuilder.vue index 3307a97db..0fe1afc33 100644 --- a/admin/src/views/first_visit/wecom_promotion/components/WecomFloatingWidgetBuilder.vue +++ b/admin/src/views/first_visit/wecom_promotion/components/WecomFloatingWidgetBuilder.vue @@ -239,7 +239,7 @@
- 无需暴露链接池浮窗点击后仍由服务端执行可用性筛选、权重随机和访问统计。 + 一个方案,一个官方链接浮窗会直接打开企业微信链接,多名医助由企业微信执行均衡分流。
@@ -274,6 +274,8 @@ interface PromotionPool { name?: string public_key?: string script_url?: string + main_url?: string + compat_go_url?: string go_url?: string install_code?: string trigger_code?: string @@ -437,11 +439,12 @@ async function copySnippet(value: string | undefined, label: string) { } function openTestLink() { - if (!props.pool.go_url) { + const targetUrl = props.pool.main_url || props.pool.go_url || props.pool.compat_go_url + if (!targetUrl) { ElMessage.warning('当前方案暂无测试链接') return } - window.open(props.pool.go_url, '_blank', 'noopener,noreferrer') + window.open(targetUrl, '_blank', 'noopener,noreferrer') } diff --git a/admin/src/views/first_visit/wecom_promotion/index.vue b/admin/src/views/first_visit/wecom_promotion/index.vue index f8d42c940..ea30a48a3 100644 --- a/admin/src/views/first_visit/wecom_promotion/index.vue +++ b/admin/src/views/first_visit/wecom_promotion/index.vue @@ -5,7 +5,7 @@

企业微信获客助手

-

对接企业微信获客助手官方 API,按角色与部门管理获客成员,并将链接安全分流到推广页面

+

一个方案保留一条企业微信官方直链,按回调结果自动调度医助权重与数量

@@ -22,15 +22,15 @@
-
分流方案{{ overview.summary.pool_count }}

每个方案生成独立 JS

+
分流方案{{ overview.summary.pool_count }}

每个方案对应一个官方链接

-
在线链接{{ overview.summary.online_links }}

停用或超限自动排除

+
官方链接{{ overview.summary.online_links }}

链接不变,成员范围自动切换

-
今日分流点击{{ overview.summary.today_clicks }}

只记录脱敏访问数据

+
今日实际获客{{ overview.summary.today_clicks }}

按企业微信回调确认承接成员

@@ -52,9 +52,9 @@ -
- 验证 API - 同步企业微信 - 复制 JS - 编辑方案 - 删除 - 创建官方获客链接 -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

公开键:{{ selectedPool.public_key }}

+ +
+ 验证 API + 复制链接 + 复制 JS + 编辑方案 + 删除 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + 创建第一个方案 @@ -220,7 +197,7 @@ show-icon :closable="false" title="消息次数回调尚未配置完成" - description="复用企业微信自建应用现有的“API 接收消息”地址即可,无需新增第二个回调;请确保该地址为 QywxExternalContactCallback/notify,且服务器 Token、AESKey 与企微后台一致。未完成前无法得到精确接收消息次数。" + description="复用企业微信自建应用现有的“API 接收消息”地址即可,无需新增第二个回调;请确保该地址为 /api/qywx/external-contact/notify,且服务器 Token、AESKey 与企微后台一致。未完成前无法自动累计成员获客数量和切换下一位。" /> - - - - - - 仅接受企业微信获客助手生成的 https://work.weixin.qq.com/ca/... 链接。 - - - - - - - - -
- - -
- - - - - 官方链接按这里的企业微信 userid 建立可见范围;越权成员不会出现在列表中。 - - - - 这是历史手工链接,只更新本地分流规则,不会调用企业微信创建或修改接口。 - -
- - 0 表示不限 -
- - - - - - - 不选择表示长期有效 - - -
- -
+ + + + + + + + 保存后会为每名医助生成一条成员规则,官方链接地址始终只有一个。 + + + + + + + 新生成的官方直链不经过本站跳转;此项仅兼容旧安装代码。 + + + + + + + + + + + +
+ + + 权重越高,在后续回调调度中被选中的频率越高。 + + + + 0 表示不限;数量按实际获客回调累计。 + +
+ + + + + + + +
+ +