from fastapi import APIRouter from fastapi.params import Depends from typing import Any import json from alien_store.api.deps import get_contract_service from alien_store.schemas.request.contract_store import TemplatesCreate from alien_store.services.contract_server import ContractServer from common.esigntool.main import fill_in_template import re, urllib.parse router = APIRouter() @router.get("/") async def index(): return {"module": "Contract", "status": "Ok"} @router.post("/get_esign_templates") async def create_esign_templates(templates_data: TemplatesCreate, templates_server: ContractServer = Depends(get_contract_service)): # 调用 e签宝生成文件 res_text = fill_in_template(templates_data.merchant_name) try: res_data = json.loads(res_text) except json.JSONDecodeError: return {"success": False, "message": "e签宝返回非 JSON", "raw": res_text} # 从返回结构提取下载链接,需与实际返回字段匹配 try: contract_url = res_data["data"]["fileDownloadUrl"] file_id = res_data["data"]["fileId"] m = re.search(r'/([^/]+)\.pdf', contract_url) if m: encoded_name = m.group(1) file_name = urllib.parse.unquote(encoded_name) except Exception: return {"success": False, "message": "e签宝返回缺少 fileDownloadUrl", "raw": res_data} # pydantic v2 使用 model_copy 更新字段 result_contract = { "contract_url": contract_url, "file_name": file_name, "file_id": file_id, "status": 0 } list_contract = [result_contract] # contract_url 字段为字符串,存储 JSON 字符串避免类型错误 result_data = templates_data.model_copy( update={"contract_url": json.dumps(list_contract, ensure_ascii=False), "seal_url": None} ) return await templates_server.create_template(result_data) @router.get("/contracts/{store_id}") async def list_contracts(store_id: int, templates_server: ContractServer = Depends(get_contract_service)) -> Any: """根据 store_id 查询所有合同""" rows = await templates_server.list_by_store(store_id) return rows