用户反馈/低价审核 admin 页改版(重命名+二维码挪位+统计修复+列增强) (#28)

- 重命名:菜单与页面标题「反馈工单→用户反馈」「上报审核→低价审核」
- 反馈页「加群二维码」卡挪到系统配置页,新增「反馈二维码」tab
- 修复反馈四态统计恒为 0:对接后端新增的 /admin/api/feedbacks/summary
- 两页表格增强:用户列拆为 用户ID/手机号/用户昵称;新增 提交版本号、机型/OS版本 列;
  点手机号弹抽屉看该用户全部记录,抽屉顶部汇总 提交/上报总计 + 奖励总计
- 低价审核:提交时间列可排序、审核结果与操作拆两列、顶部统计改卡片式、
  Trace 列对齐比价记录页(有 trace_url 即可点)
- 修复反馈时间显示快 8 小时:反馈时间为北京 wall-clock,改用 formatWallTime

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: zzhyyyyy <2685922758@qq.com>
Reviewed-on: #28
Co-authored-by: zhuzihao <zhuzihao@wonderable.ai>
Co-committed-by: zhuzihao <zhuzihao@wonderable.ai>
This commit was merged in pull request #28.
This commit is contained in:
2026-06-29 23:11:07 +08:00
committed by marco
parent d7129186c5
commit 98cea13d51
8 changed files with 538 additions and 433 deletions
+28 -76
View File
@@ -247,6 +247,22 @@ export interface Feedback {
reviewed_by_admin_id: number | null;
reviewed_at: string | null;
created_at: string;
// 提交端环境快照:提交版本号 / 机型OS版本;改版前的历史反馈为 null
app_version: string | null;
device_model: string | null;
rom_name: string | null;
android_version: string | null;
// 联表瞬态:展示完整手机号(点手机号查该用户全部反馈)
phone: string | null;
nickname: string | null;
}
// 反馈审核台顶部各状态计数(pending 含历史 new 态)。后端 GET /admin/api/feedbacks/summary。
export interface FeedbackSummary {
pending: number;
adopted: number;
rejected: number;
total: number;
}
// 反馈页「加群二维码」卡配置(运营后台改 → App 意见反馈页同步)。
@@ -391,12 +407,6 @@ export interface AdRevenueTypeStat {
revenue_yuan: number; // 该类型预估收益合计(元)
}
export interface AdRevenueTypeBreakdown extends AdRevenueTypeStat {
ad_type: string;
expected_coin: number;
actual_coin: number;
}
// 广告收益报表:一次广告事件(逐条一行)。激励视频展示+发奖按 ad_session_id 合并;信息流展示/发奖各自成行。
export interface AdRevenueRow {
event_key: string; // 事件稳定唯一键(前端 rowKey)
@@ -442,52 +452,9 @@ export interface AdRevenueReport {
total_expected_coin: number;
total_actual_coin: number;
mismatch_count: number; // 应发≠实发的发奖条数
by_ad_type?: Record<string, AdRevenueTypeBreakdown>;
items: AdRevenueRow[];
}
export interface DashboardPeriodTrendPoint {
date: string;
active_users: number;
new_users: number;
comparisons: number;
}
export interface DashboardPeriodStats {
date_from: string;
date_to: string;
users: {
new: number;
active: number;
retained_new_users: number;
retention_rate: number | null;
retention_note: string;
};
comparison: {
total: number;
success: number;
success_rate: number;
ordered: number;
average_duration_ms: number | null;
average_saved_cents: number | null;
};
coins: {
granted_total: number;
reward_video_coin_total: number;
feed_ad_coin_total: number;
signin_coin_total: number;
signin_boost_coin_total: number;
task_coin_total: number;
coupon_reward_coin_total: number;
comparison_reward_coin_total: number;
regular_task_coin_total: number;
};
cash: {
withdraw_success_cents: number;
};
trend: DashboardPeriodTrendPoint[];
}
export interface DashboardOverview {
users: {
total: number;
@@ -497,17 +464,7 @@ export interface DashboardOverview {
new_today: number;
dau: number;
};
coins: {
granted_total: number;
reward_video_coin_total?: number;
reward_video_watch_count?: number;
feed_ad_coin_total?: number;
feed_ad_watch_count?: number;
signin_coin_total?: number;
signin_count?: number;
signin_boost_coin_total?: number;
signin_boost_watch_count?: number;
};
coins: { granted_total: number };
cash: {
withdraw_success_cents: number;
withdraw_pending_count: number;
@@ -515,23 +472,8 @@ export interface DashboardOverview {
withdraw_failed_count: number;
};
comparison: { total: number; success: number; success_rate: number };
period: DashboardPeriodStats;
feedback: { new: number };
cps: {
available: boolean;
note: string;
meituan_order_count?: number;
meituan_commission_cents?: number;
meituan_hit_count?: number;
meituan_miss_count?: number;
meituan_unknown_rate_count?: number;
meituan_hit_rate?: number | null;
jd_order_count?: number;
jd_commission_cents?: number;
jd_actual_commission_cents?: number;
jd_estimated_commission_cents?: number;
jd_invalid_count?: number;
};
cps: { available: boolean; note: string };
}
export interface PriceReport {
@@ -552,6 +494,16 @@ export interface PriceReport {
reward_coins: number | null;
reviewed_at: string | null;
created_at: string;
// 联表瞬态:phone/nickname 展示完整手机号(点手机号查该用户全部上报);
// 其余取自关联比价记录(无关联记录时为 null):trace 调试链接、机型OS版本、提交版本号
phone: string | null;
nickname: string | null;
trace_id: string | null;
trace_url: string | null;
device_model: string | null; // 机型,如 PEEM00
rom_name: string | null; // ROM/OS 名,如 ColorOS / MIUI / HarmonyOS
android_version: string | null; // Android 版本号,如 13
app_version: string | null; // 提交时我们 app 的 versionName,如 1.2.3
}
export interface PriceReportSummary {