Allow partial market rates in CSV export

This commit is contained in:
2026-04-22 19:22:10 +08:00
parent c7ae2fbfcb
commit 2f77199920
5 changed files with 138 additions and 16 deletions
+3 -3
View File
@@ -109,7 +109,7 @@ export function mapAuthorAseInfoResponse(payload: unknown): MarketApiResult {
data.personal_avg_search_after_view_rate
);
if (!singleVideoAfterSearchRate || !personalVideoAfterSearchRate) {
if (!singleVideoAfterSearchRate && !personalVideoAfterSearchRate) {
return {
success: false,
reason: "missing-rate"
@@ -119,8 +119,8 @@ export function mapAuthorAseInfoResponse(payload: unknown): MarketApiResult {
return {
success: true,
rates: {
singleVideoAfterSearchRate,
personalVideoAfterSearchRate
...(singleVideoAfterSearchRate ? { singleVideoAfterSearchRate } : {}),
...(personalVideoAfterSearchRate ? { personalVideoAfterSearchRate } : {})
}
};
}
+34 -2
View File
@@ -43,9 +43,40 @@ const RATE_COLUMNS: CsvColumn[] = [
}
];
const BACKEND_METRIC_COLUMNS: CsvColumn[] = [
{
header: "看后搜率",
readValue: (record: MarketRecord) =>
record.backendMetrics?.afterViewSearchRate ?? ""
},
{
header: "看后搜数",
readValue: (record: MarketRecord) =>
record.backendMetrics?.afterViewSearchCount ?? ""
},
{
header: "新增A3数",
readValue: (record: MarketRecord) =>
record.backendMetrics?.a3IncreaseCount ?? ""
},
{
header: "新增A3率",
readValue: (record: MarketRecord) =>
record.backendMetrics?.newA3Rate ?? ""
},
{
header: "CPA3",
readValue: (record: MarketRecord) => record.backendMetrics?.cpa3 ?? ""
},
{
header: "cp_search",
readValue: (record: MarketRecord) => record.backendMetrics?.cpSearch ?? ""
}
];
export function buildMarketCsv(records: MarketRecord[]): string {
const baseColumns = buildBaseColumns(records);
const csvColumns = [...baseColumns, ...RATE_COLUMNS];
const csvColumns = [...baseColumns, ...RATE_COLUMNS, ...BACKEND_METRIC_COLUMNS];
const headerLine = csvColumns.map((column) => column.header).join(",");
const rowLines = records.map((record) =>
csvColumns.map((column) => escapeCsvCell(column.readValue(record))).join(",")
@@ -57,10 +88,11 @@ export function buildMarketCsv(records: MarketRecord[]): string {
function buildBaseColumns(records: MarketRecord[]): CsvColumn[] {
const orderedHeaders: string[] = [];
const seenHeaders = new Set<string>();
const excludedHeaders = new Set(["代表视频"]);
records.forEach((record) => {
Object.keys(record.exportFields ?? {}).forEach((header) => {
if (seenHeaders.has(header)) {
if (seenHeaders.has(header) || excludedHeaders.has(header)) {
return;
}
+1 -1
View File
@@ -60,7 +60,7 @@ export type MarketApiFailureReason =
export type MarketApiSuccessResult = {
success: true;
rates: Required<AfterSearchRates>;
rates: AfterSearchRates;
};
export type MarketApiFailureResult = {