feat: honor all-range export and batch scope

This commit is contained in:
wxs
2026-07-27 16:00:57 +08:00
parent e15bc0657a
commit e03dedd91e
5 changed files with 293 additions and 47 deletions
+56 -20
View File
@@ -339,16 +339,15 @@ export function createMarketController(options: CreateMarketControllerOptions) {
const toolbarHandlers = {
onExportAudienceProfile: async () => {
syncSelectionStateFromDom();
if (selectedAuthorIds.size === 0) {
setToolbarExportStatus(toolbar, "请先勾选需要导出数据的达人");
return;
}
const exportTarget = readToolbarExportTarget(toolbar);
if (!exportTarget.target) {
setToolbarExportStatus(toolbar, exportTarget.error ?? "导出配置无效");
return;
}
if (selectedAuthorIds.size === 0 && exportTarget.target.mode !== "all") {
setToolbarExportStatus(toolbar, "请先勾选需要导出数据的达人");
return;
}
setToolbarBusyState(toolbar, true);
try {
@@ -356,16 +355,27 @@ export function createMarketController(options: CreateMarketControllerOptions) {
const exportSelection = resolveAudienceProfileExportSelection(
selectedHeaders
);
const selectedRecords = filterRecordsBySelectionStrict(
await exportRecords(exportTarget.target, "画像导出中", {
const resolvedRecords = await exportRecords(
exportTarget.target,
"画像导出中",
{
includeBackendMetrics: exportSelection.includeBackendMetrics,
includeRates: exportSelection.includeRates,
showDetailedProgress: false,
spreadInfoConfigs: exportSelection.spreadInfoConfigs
})
}
);
const selectedRecords = filterRecordsForAudienceProfileExport(
resolvedRecords,
exportTarget.target
);
if (selectedRecords.length === 0) {
setToolbarExportStatus(toolbar, "当前导出范围内没有选中的达人");
setToolbarExportStatus(
toolbar,
exportTarget.target.mode === "all" && selectedAuthorIds.size > 0
? "全部范围内没有选中的达人"
: "当前导出范围内没有选中的达人"
);
return;
}
@@ -510,18 +520,29 @@ export function createMarketController(options: CreateMarketControllerOptions) {
setToolbarBusyState(toolbar, true);
try {
const hasSelectedAuthors = selectedAuthorIds.size > 0;
const records = filterRecordsBySelection(
await applySpreadThresholdFilter(
await exportRecords(
exportTarget.target,
hasSelectedAuthors ? "提交已选达人中" : "提交中",
{
showDetailedProgress: !hasSelectedAuthors
}
),
spreadFilter.filter
)
const resolvedRecords = await applySpreadThresholdFilter(
await exportRecords(
exportTarget.target,
hasSelectedAuthors ? "提交已选达人中" : "提交中",
{
showDetailedProgress: !hasSelectedAuthors
}
),
spreadFilter.filter
);
const records =
exportTarget.target.mode === "all"
? filterRecordsForAllRange(resolvedRecords)
: filterRecordsBySelection(resolvedRecords);
if (records.length === 0) {
setToolbarExportStatus(
toolbar,
exportTarget.target.mode === "all" && hasSelectedAuthors
? "全部范围内没有选中的达人"
: "当前范围内没有可提交的达人"
);
return;
}
const authState = await getAuthState();
if (!authState.isAuthenticated) {
throw new Error("请先登录插件");
@@ -1168,6 +1189,21 @@ export function createMarketController(options: CreateMarketControllerOptions) {
return records.filter((record) => selectedAuthorIds.has(record.authorId));
}
function filterRecordsForAllRange(records: MarketRecord[]): MarketRecord[] {
return selectedAuthorIds.size === 0
? records
: filterRecordsBySelectionStrict(records);
}
function filterRecordsForAudienceProfileExport(
records: MarketRecord[],
target: MarketExportTarget
): MarketRecord[] {
return target.mode === "all"
? filterRecordsForAllRange(records)
: filterRecordsBySelectionStrict(records);
}
async function loadAudienceProfileSet(
record: MarketRecord,
exportSelection: AudienceProfileExportSelection
@@ -51,10 +51,11 @@ export function createSilentExportController(
const mergedRecords = new Map<string, MarketRecord>();
const maxPageCount = target.mode === "count" ? target.pageCount : 200;
const initialPage = target.mode === "all" ? 1 : baseRequest.initialPage;
let totalPagesHint: number | undefined;
for (let offset = 0; offset < maxPageCount; offset += 1) {
const pageNumber = baseRequest.initialPage + offset;
const pageNumber = initialPage + offset;
options.onProgress?.({
currentPage: offset + 1,
totalPages: target.mode === "count" ? target.pageCount : totalPagesHint