import { Alert } from 'react-native'; import pLimit from 'p-limit'; import { getMediaByDateRange } from './media'; import { processAndUploadMedia } from './uploader'; import { ExtendedAsset } from './types'; import { insertUploadTask, getUploadTaskStatus } from '../db'; // 设置最大并发数 const CONCURRENCY_LIMIT = 10; // 同时最多上传10个文件 const limit = pLimit(CONCURRENCY_LIMIT); // 手动触发上传 export const triggerManualUpload = async (startDate: Date, endDate: Date) => { try { const media = await getMediaByDateRange(startDate, endDate); if (media.length === 0) { Alert.alert('提示', '在指定时间范围内未找到媒体文件'); return []; } const uploadPromises = media.map((asset: ExtendedAsset) => limit(async () => { const existingTask = await getUploadTaskStatus(asset.uri); if (!existingTask) { await insertUploadTask(asset.uri, asset.filename); } else if (existingTask.status === 'success' || existingTask.status === 'skipped') { console.log(`File ${asset.uri} already ${existingTask.status}, skipping processing.`); return null; // Skip processing if already successful or skipped } return processAndUploadMedia(asset); }) ); const results = await Promise.all(uploadPromises); // 过滤掉因为已上传而返回 null 的结果 const finalResults = results.filter(result => result !== null); console.log('Manual upload completed.', { total: media.length, uploaded: finalResults.length, skipped: media.length - finalResults.length }); return finalResults; } catch (error) { console.error('手动上传过程中出现错误:', error); Alert.alert('错误', '上传过程中出现错误'); throw error; } };