Allow partial market rates in CSV export
This commit is contained in:
@@ -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 } : {})
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ export type MarketApiFailureReason =
|
||||
|
||||
export type MarketApiSuccessResult = {
|
||||
success: true;
|
||||
rates: Required<AfterSearchRates>;
|
||||
rates: AfterSearchRates;
|
||||
};
|
||||
|
||||
export type MarketApiFailureResult = {
|
||||
|
||||
Reference in New Issue
Block a user