落地报价模板主账与后台:合同映射、灌种 SQL/脚本、智能体填表,并补测服运维探针与合同文档对齐。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -12,6 +12,7 @@ from dataclasses import dataclass
|
||||
from typing import Any, Optional
|
||||
|
||||
from agent.jobs.libreoffice import LibreOfficeConverter, LibreOfficeResult
|
||||
from agent.jobs.quote_fill import fill_then_convert_pdf
|
||||
from agent.redis_coord import get_redis_runtime, try_acquire_idempotency
|
||||
from agent.redis_coord.keys import STREAM_PDF
|
||||
from agent.redis_coord.runtime import RedisRuntime
|
||||
@@ -71,10 +72,32 @@ def process_pdf_job(
|
||||
"""
|
||||
处理一条 PDF 任务(调用方必须已占用 libreoffice 槽)。
|
||||
|
||||
缺 xlsx_path 或本机无 soffice 时返回 ok=False,不抛崩 Worker。
|
||||
若 payload 含 template_xlsx + mapping_json + facts,先 quote_fill 再转 PDF。
|
||||
缺路径或本机无 soffice 时返回 ok=False,不抛崩 Worker。
|
||||
"""
|
||||
path = str(data.get("xlsx_path") or "")
|
||||
conv = converter or LibreOfficeConverter.from_settings()
|
||||
template_xlsx = str(data.get("template_xlsx") or "")
|
||||
mapping_json = data.get("mapping_json")
|
||||
facts = data.get("facts")
|
||||
work_dir = str(data.get("work_dir") or "")
|
||||
if template_xlsx and mapping_json is not None and isinstance(facts, dict):
|
||||
from pathlib import Path
|
||||
import tempfile
|
||||
|
||||
wd = Path(work_dir) if work_dir else Path(tempfile.mkdtemp(prefix="quote_fill_"))
|
||||
fill, pdf = fill_then_convert_pdf(
|
||||
source_xlsx=template_xlsx,
|
||||
work_dir=wd,
|
||||
mapping=mapping_json if not isinstance(mapping_json, str) else mapping_json,
|
||||
facts=facts,
|
||||
converter=conv,
|
||||
)
|
||||
if not fill.ok:
|
||||
return LibreOfficeResult(ok=False, error=f"fill_failed:{fill.error}")
|
||||
assert pdf is not None
|
||||
return pdf
|
||||
|
||||
path = str(data.get("xlsx_path") or "")
|
||||
if not path:
|
||||
return LibreOfficeResult(ok=False, error="missing_xlsx_path")
|
||||
return conv.convert_xlsx_to_pdf(path)
|
||||
|
||||
Reference in New Issue
Block a user