From 5bec909dbd59acab1d87dd616a0b0572b614b571 Mon Sep 17 00:00:00 2001 From: linkeyu Date: Sat, 1 Aug 2026 23:26:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AF=B9=E9=BD=90=E9=A2=86=E5=88=B8?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E7=8E=87=E5=88=86=E6=AF=8D=E5=8F=A3=E5=BE=84?= =?UTF-8?q?=20(#101)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 改动说明 - 对齐后端领券成功率新口径 - 卡片提示展示成功次数、发起数、中途退出数和实际分母 - 中途退出已有结果显示真实单券成功率 - 完全无逐券事件显示 0.0%(退出前无结果) - 只有 skipped 时显示 0.0%(无有效结果),并保留可点击的逐券明细入口 - 完成/失败记录缺埋点仍显示 -,避免误报为 0% - 点位成功率维持原有独立口径 ## 验证 - TypeScript 类型检查通过 - 生产构建通过 - 已覆盖部分成功、无事件、只有 skipped、非退出埋点缺失组合 依赖后端:WonderableAI/shaguabijia-app-server#213,请同步发布。 --------- Co-authored-by: linkeyu <798648091@qq.com> Reviewed-on: https://gitea.shaguabijia.com/WonderableAI/shaguabijia-admin-web/pulls/101 Co-authored-by: linkeyu Co-committed-by: linkeyu --- src/app/(main)/coupon-data/page.tsx | 26 +++++++++++++++++++++----- src/app/(main)/dashboard/page.tsx | 9 ++++++--- src/lib/types.ts | 2 ++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/app/(main)/coupon-data/page.tsx b/src/app/(main)/coupon-data/page.tsx index 8f4ed8f..1258b7c 100644 --- a/src/app/(main)/coupon-data/page.tsx +++ b/src/app/(main)/coupon-data/page.tsx @@ -76,6 +76,7 @@ interface CouponDataRow { claimed_count: number | null; point_success_count: number | null; point_total_count: number | null; + point_event_count?: number; // 兼容旧后端的内嵌明细;新后端不再返回,改为点击后按 trace 加载。 point_details?: CouponPointDetail[]; trace_url: string | null; @@ -145,15 +146,22 @@ function PointScorePopover({ row }: { row: CouponDataRow }) { const [loading, setLoading] = useState(false); const [loadError, setLoadError] = useState(null); - if (row.point_success_count == null || row.point_total_count == null || row.point_total_count <= 0) { + const abandonedWithoutScoredResult = + row.status === 'abandoned' && row.point_success_count === 0 && row.point_total_count === 0; + if ( + row.point_success_count == null || + row.point_total_count == null || + (row.point_total_count <= 0 && !abandonedWithoutScoredResult) + ) { return -; } const score = `${row.point_success_count}/${row.point_total_count}`; - const scoreWithRate = `${score}(${( - row.point_success_count / row.point_total_count * 100 - ).toFixed(1)}%)`; + const hasPointDetails = (row.point_event_count ?? 0) > 0; + const scoreWithRate = abandonedWithoutScoredResult + ? `0.0%(${hasPointDetails ? '无有效结果' : '退出前无结果'})` + : `${score}(${(row.point_success_count / row.point_total_count * 100).toFixed(1)}%)`; const scoreColor = - row.point_success_count === row.point_total_count + row.point_total_count > 0 && row.point_success_count === row.point_total_count ? STATUS_TAG.completed.color : STATUS_TAG.abandoned.color; const loadDetails = async () => { @@ -174,6 +182,14 @@ function PointScorePopover({ row }: { row: CouponDataRow }) { } }; + if (abandonedWithoutScoredResult && !hasPointDetails) { + return ( + + {scoreWithRate} + + ); + } + return (