前后端基本架构和完全excel表的解析及统计图表的生成以及excel表的到出
This commit is contained in:
94
frontend/supabase/functions/fill-template/index.ts
Normal file
94
frontend/supabase/functions/fill-template/index.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts';
|
||||
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2';
|
||||
import { corsHeaders } from '../_shared/cors.ts';
|
||||
|
||||
serve(async (req) => {
|
||||
if (req.method === 'OPTIONS') {
|
||||
return new Response(null, { headers: corsHeaders });
|
||||
}
|
||||
|
||||
try {
|
||||
const { taskId } = await req.json();
|
||||
if (!taskId) throw new Error('Missing taskId');
|
||||
|
||||
const supabaseUrl = Deno.env.get('SUPABASE_URL')!;
|
||||
const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
|
||||
const supabase = createClient(supabaseUrl, supabaseKey);
|
||||
|
||||
// Get task and documents
|
||||
const { data: task, error: taskError } = await supabase
|
||||
.from('fill_tasks')
|
||||
.select('*, templates(*)')
|
||||
.eq('id', taskId)
|
||||
.single();
|
||||
|
||||
if (taskError || !task) throw new Error('Task not found');
|
||||
|
||||
const { data: entities, error: entitiesError } = await supabase
|
||||
.from('extracted_entities')
|
||||
.select('*')
|
||||
.in('document_id', task.document_ids);
|
||||
|
||||
if (entitiesError) throw new Error('Failed to fetch entities');
|
||||
|
||||
// Aggregate entities for context
|
||||
const context = entities.map(e => `${e.entity_type}: ${e.entity_value}`).join('\n');
|
||||
|
||||
// Get template content (assume docx/xlsx text extraction for template)
|
||||
// Actually, MiniMax can help generate the final filled content if we provide the template structure
|
||||
const miniMaxApiKey = Deno.env.get('INTEGRATIONS_API_KEY');
|
||||
const miniMaxResponse = await fetch(
|
||||
'https://app-a6ww9j3ja3nl-api-Aa2PqMJnJGwL-gateway.appmiaoda.com/v1/text/chatcompletion_v2',
|
||||
{
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'X-Gateway-Authorization': `Bearer ${miniMaxApiKey}`,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: 'MiniMax-M2.5',
|
||||
messages: [
|
||||
{
|
||||
role: 'system',
|
||||
content: '你是一个专业的文档处理助手。请根据提供的源数据实体,自动填充到给定的表格模板中。生成的文档应当格式严谨,满足业务应用需求。'
|
||||
},
|
||||
{
|
||||
role: 'user',
|
||||
content: `源数据信息如下:\n\n${context}\n\n模板名称:${task.templates.name}\n模板类型:${task.templates.type}\n\n请生成填充后的文档内容预览(以 Markdown 格式呈现,确保包含所有源数据中的关键指标)。`
|
||||
}
|
||||
]
|
||||
})
|
||||
}
|
||||
);
|
||||
|
||||
const miniMaxData = await miniMaxResponse.json();
|
||||
if (!miniMaxResponse.ok) throw new Error('MiniMax filling failed');
|
||||
|
||||
const resultText = miniMaxData.choices[0].message.content;
|
||||
|
||||
// Update task
|
||||
const { error: updateError } = await supabase
|
||||
.from('fill_tasks')
|
||||
.update({
|
||||
status: 'completed',
|
||||
result_path: `results/${taskId}.md` // Save as md for simplicity in this demo
|
||||
})
|
||||
.eq('id', taskId);
|
||||
|
||||
// Store result in storage
|
||||
await supabase.storage
|
||||
.from('document_storage')
|
||||
.upload(`results/${taskId}.md`, new Blob([resultText], { type: 'text/markdown' }));
|
||||
|
||||
return new Response(JSON.stringify({ success: true, result: resultText }), {
|
||||
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error filling template:', error);
|
||||
return new Response(JSON.stringify({ error: error.message }), {
|
||||
status: 500,
|
||||
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user