router.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from fastapi import APIRouter
  2. from fastapi.params import Depends
  3. from typing import Any
  4. import json
  5. from alien_store.api.deps import get_contract_service
  6. from alien_store.schemas.request.contract_store import TemplatesCreate
  7. from alien_store.services.contract_server import ContractServer
  8. from common.esigntool.main import fill_in_template
  9. import re, urllib.parse
  10. router = APIRouter()
  11. @router.get("/")
  12. async def index():
  13. return {"module": "Contract", "status": "Ok"}
  14. @router.post("/get_esign_templates")
  15. async def create_esign_templates(templates_data: TemplatesCreate, templates_server: ContractServer = Depends(get_contract_service)):
  16. # 调用 e签宝生成文件
  17. res_text = fill_in_template(templates_data.merchant_name)
  18. try:
  19. res_data = json.loads(res_text)
  20. except json.JSONDecodeError:
  21. return {"success": False, "message": "e签宝返回非 JSON", "raw": res_text}
  22. # 从返回结构提取下载链接,需与实际返回字段匹配
  23. try:
  24. contract_url = res_data["data"]["fileDownloadUrl"]
  25. file_id = res_data["data"]["fileId"]
  26. m = re.search(r'/([^/]+)\.pdf', contract_url)
  27. if m:
  28. encoded_name = m.group(1)
  29. file_name = urllib.parse.unquote(encoded_name)
  30. except Exception:
  31. return {"success": False, "message": "e签宝返回缺少 fileDownloadUrl", "raw": res_data}
  32. # pydantic v2 使用 model_copy 更新字段
  33. result_contract = {
  34. "contract_url": contract_url,
  35. "file_name": file_name,
  36. "file_id": file_id,
  37. "status": 0
  38. }
  39. list_contract = [result_contract]
  40. # contract_url 字段为字符串,存储 JSON 字符串避免类型错误
  41. result_data = templates_data.model_copy(
  42. update={"contract_url": json.dumps(list_contract, ensure_ascii=False), "seal_url": None}
  43. )
  44. return await templates_server.create_template(result_data)
  45. @router.get("/contracts/{store_id}")
  46. async def list_contracts(store_id: int, templates_server: ContractServer = Depends(get_contract_service)) -> Any:
  47. """根据 store_id 查询所有合同"""
  48. rows = await templates_server.list_by_store(store_id)
  49. return rows