补齐后台埋点导出和任务事件选择

后台埋点查询支持日期筛选和导出全部模式

新增后台真实 event key 列表接口

任务配置页改用真实 user 埋点 key 候选

更新后台埋点查询文档和定向测试
This commit is contained in:
2026-06-26 16:49:33 +08:00
parent 607042a250
commit a8c3f8cf0f
10 changed files with 613 additions and 88 deletions
@@ -1,4 +1,7 @@
import type {TrackingScopeKind} from '../api/adminApiTypes';
import type {
AdminTrackingEventKeyPayload,
TrackingScopeKind,
} from '../api/adminApiTypes';
export interface AdminTrackingEventDefinition {
key: string;
@@ -8,6 +11,14 @@ export interface AdminTrackingEventDefinition {
taskConfigEligible?: boolean;
}
export interface AdminTrackingEventKeyOption {
key: string;
title: string;
scopeKind: TrackingScopeKind | string;
scopeKinds: string[];
remark: string;
}
export const adminTrackingEventDefinitions: AdminTrackingEventDefinition[] = [
{
key: 'auth_login_options_view',
@@ -25,7 +36,8 @@ export const adminTrackingEventDefinitions: AdminTrackingEventDefinition[] = [
key: 'daily_login',
title: '每日登录',
scopeKind: 'user',
remark: '认证成功或 refresh 续期后由后端幂等记录,用于每日登录任务进度校验。',
remark:
'认证成功或 refresh 续期后由后端幂等记录,用于每日登录任务进度校验。',
taskConfigEligible: true,
},
{
@@ -368,7 +380,8 @@ export const adminTrackingEventDefinitions: AdminTrackingEventDefinition[] = [
key: 'match3d_route_success',
title: '抓大鹅路由成功',
scopeKind: 'user',
remark: '抓大鹅创作或运行接口成功响应后兜底记录;GET 入口可能按 site 统计。',
remark:
'抓大鹅创作或运行接口成功响应后兜底记录;GET 入口可能按 site 统计。',
},
{
key: 'square_hole_route_success',
@@ -392,12 +405,15 @@ export const adminTrackingEventDefinitions: AdminTrackingEventDefinition[] = [
key: 'work_play_start',
title: '作品开始游玩',
scopeKind: 'work',
remark: '拼图、抓大鹅、方洞、自定义世界、大鱼吃小鱼、Visual Novel 正式开始游玩时记录。',
remark:
'拼图、抓大鹅、方洞、自定义世界、大鱼吃小鱼、Visual Novel 正式开始游玩时记录。',
},
];
export const adminProfileTaskTrackingEventDefinitions =
adminTrackingEventDefinitions.filter((definition) => definition.taskConfigEligible);
adminTrackingEventDefinitions.filter(
(definition) => definition.taskConfigEligible,
);
export function findAdminTrackingEventDefinition(eventKey: string) {
const normalizedEventKey = eventKey.trim();
@@ -412,6 +428,41 @@ export function filterAdminTrackingEventDefinitions(query: string) {
return filterTrackingEventDefinitions(adminTrackingEventDefinitions, query);
}
export function buildAdminTrackingEventKeyOptions(
eventKeys: AdminTrackingEventKeyPayload[],
): AdminTrackingEventKeyOption[] {
const options = new Map<string, AdminTrackingEventKeyOption>();
for (const payload of eventKeys) {
const key = payload.eventKey.trim();
if (!key || options.has(key)) {
continue;
}
const definition = findAdminTrackingEventDefinition(key);
const scopeKinds = payload.scopeKinds.length
? payload.scopeKinds
: definition
? [definition.scopeKind]
: [];
options.set(key, {
key,
title: definition?.title ?? (payload.eventTitle || key),
scopeKind: definition?.scopeKind ?? scopeKinds[0] ?? '',
scopeKinds,
remark: definition?.remark ?? '真实埋点库中已出现的 event key。',
});
}
return [...options.values()].sort((left, right) =>
left.key.localeCompare(right.key),
);
}
export function filterAdminTrackingEventKeyOptions(
options: AdminTrackingEventKeyOption[],
query: string,
) {
return filterTrackingEventDefinitions(options, query);
}
export function filterAdminProfileTaskTrackingEventDefinitions(query: string) {
return filterTrackingEventDefinitions(
adminProfileTaskTrackingEventDefinitions,
@@ -420,7 +471,9 @@ export function filterAdminProfileTaskTrackingEventDefinitions(query: string) {
}
function filterTrackingEventDefinitions(
definitions: AdminTrackingEventDefinition[],
definitions: Array<
AdminTrackingEventDefinition | AdminTrackingEventKeyOption
>,
query: string,
) {
const normalizedQuery = query.trim().toLowerCase();