${batchSearchInput}
${batchSearchApplyBtn}
`;
const batchHeaderTools = `
批量任务
${escapeHtml(summaryName)}
${records.length} 个文件
${timeLabel}${targetLang ? ` · 语言:${escapeHtml(targetLang)}` : ''}
${batchExportBtn}
${batchDeleteBtn}
${batchHeaderTools}
${renderExportConfigPanel({
id: configId,
scope: 'batch',
ownerId: batchId,
template,
formats,
zipEnabled,
structure,
withinBatch: true
})}
${batchChildrenHtml}
`;
}
function renderHistoryRecordItem(record, options = {}) {
const safeId = sanitizeId(record.id || 'record');
const withinBatch = !!options.withinBatch;
const status = analyzeRecordStatus(record);
const statusBadge = buildStatusBadge(status);
const ocrSnippet = buildSnippetText(record.ocr);
const translationSnippet = buildSnippetText(record.translation);
const timeLabel = formatDisplayTime(record.time);
// 新增:模型信息(兼容旧记录无该字段情况)
const ocrEngine = (record.ocrEngine || '').toLowerCase();
const ocrLabel = ocrEngine === 'mistral' ? 'Mistral OCR' : ocrEngine === 'mineru' ? 'MinerU OCR' : ocrEngine === 'doc2x' ? 'Doc2X OCR' : '';
const transName = record.translationModelName || 'none';
let transLabel = '';
if (transName === 'none') {
transLabel = '未翻译';
} else if (transName === 'custom') {
// 显示自定义源站配置的“模型ID”(优先),若缺失则退回显示名称/自定义
transLabel = record.translationModelId
? escapeHtml(record.translationModelId)
: (record.translationModelCustomName ? escapeHtml(record.translationModelCustomName) : '自定义');
} else {
// 预设模型
const mapping = { deepseek: 'DeepSeek', gemini: 'Gemini', tongyi: '通义百炼', volcano: '火山引擎', deeplx: 'DeepLX' };
transLabel = mapping[transName] || transName;
}
const targetLang = record.batchOutputLanguage || record.targetLanguage || '';
const relativePathLabel = buildRelativePathLabel(record);
const template = record.batchTemplate || DEFAULT_EXPORT_TEMPLATE;
const rawFormats = Array.isArray(record.batchFormats) && record.batchFormats.length > 0
? Array.from(new Set(['original', ...record.batchFormats]))
: DEFAULT_EXPORT_FORMATS;
let formats = rawFormats.filter(fmt => SUPPORTED_EXPORT_FORMATS.includes(fmt));
if (formats.length === 0) {
formats = [...DEFAULT_EXPORT_FORMATS];
}
const zipEnabled = typeof record.batchZip === 'boolean' ? record.batchZip : false;
const structure = record.batchZipStructure || PACKAGING_OPTIONS.preserve;
const configId = `record-export-config-${safeId}${options.batchId ? `-${sanitizeId(options.batchId)}` : ''}`;
const retryDisabled = status.failed === 0 ? 'disabled opacity-50 cursor-not-allowed' : '';
const folderId = resolveRecordFolder(record.id, currentFolderAssignments);
const folderSelectHtml = renderFolderSelect({
scope: 'record',
ownerId: record.id,
selectedId: folderId,
isMixed: false
});
const escapedRecordId = escapeAttr(record.id || '');
const exportBtnHtml = `
${escapeHtml(record.name || '未命名')} ${statusBadge}
${timeLabel}${targetLang ? ` · 语言:${escapeHtml(targetLang)}` : ''}
${(ocrLabel || (transLabel && transLabel !== '未翻译')) ? `
${ocrLabel ? `OCR:${ocrLabel}` : ''}
${(ocrLabel && (transLabel && transLabel !== '未翻译')) ? ' · ' : ''}
${(transLabel && transLabel !== '未翻译') ? `翻译:${escapeHtml(transLabel)}` : ''}
` : ''}
文件夹
${folderSelectHtml}
${exportBtnHtml}
${startReadingBtnHtml}
${downloadBtnHtml}
${deleteBtnHtml}
操作
${exportBtnHtml}
${startReadingBtnHtml}
${downloadBtnHtml}
${deleteBtnHtml}
OCR:${ocrSnippet}
翻译:${translationSnippet}
${renderExportConfigPanel({
id: configId,
scope: 'record',
ownerId: record.id,
template,
formats,
zipEnabled,
structure,
withinBatch
})}
`;
}
function renderExportConfigPanel({ id, scope, ownerId, template, formats, zipEnabled, structure, withinBatch }) {
const formatOptions = SUPPORTED_EXPORT_FORMATS.map(fmt => {
const checked = formats.includes(fmt) ? 'checked' : '';
const label = fmt === 'original' ? '原格式' : fmt.toUpperCase();
return `