router.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import logging
  2. from fastapi import APIRouter, Depends
  3. from typing import Any, Union
  4. from pydantic import ValidationError
  5. from alien_store.api.deps import get_contract_center_service
  6. from alien_contract.schemas.request.contract import BundleCreateRequest
  7. from alien_contract.services.contract_server import ContractCenterService
  8. from alien_store.schemas.request.contract_store import TemplatesCreate
  9. from alien_store.schemas.response.contract_store import (
  10. ModuleStatusResponse,
  11. TemplatesCreateResponse,
  12. ErrorResponse,
  13. )
  14. router = APIRouter()
  15. logger = logging.getLogger("alien_store")
  16. def _format_validation_errors(exc: ValidationError) -> list[dict[str, str]]:
  17. errors = []
  18. for err in exc.errors():
  19. loc = err.get("loc", ())
  20. field = ".".join(str(item) for item in loc if item != "body")
  21. errors.append(
  22. {
  23. "field": field or "body",
  24. "type": err.get("type", "validation_error"),
  25. "message": err.get("msg", "参数校验失败"),
  26. }
  27. )
  28. return errors
  29. @router.get("/", response_model=ModuleStatusResponse)
  30. async def index() -> ModuleStatusResponse:
  31. return ModuleStatusResponse(module="Contract", status="Ok")
  32. @router.post("/get_esign_templates", response_model=Union[TemplatesCreateResponse, ErrorResponse])
  33. async def create_esign_templates(
  34. templates_data_raw: dict[str, Any],
  35. templates_server: ContractCenterService = Depends(get_contract_center_service)
  36. ) -> Union[TemplatesCreateResponse, ErrorResponse]:
  37. """AI审核完调用 e签宝生成文件(统一走合同中心)"""
  38. try:
  39. templates_data = TemplatesCreate.model_validate(templates_data_raw)
  40. except ValidationError as e:
  41. detail = _format_validation_errors(e)
  42. logger.error("get_esign_templates validation failed: %s", detail)
  43. return ErrorResponse(
  44. success=False,
  45. message="请求参数校验失败",
  46. raw={"errors": detail},
  47. )
  48. request = BundleCreateRequest(
  49. subject_type="store",
  50. subject_id=templates_data.store_id,
  51. subject_name=templates_data.store_name,
  52. business_segment=templates_data.business_segment,
  53. contact_name=templates_data.merchant_name,
  54. contact_phone=templates_data.contact_phone,
  55. ord_id=templates_data.ord_id,
  56. )
  57. result = await templates_server.create_bundle(request)
  58. if not result.get("success"):
  59. return ErrorResponse(**result)
  60. return TemplatesCreateResponse(
  61. success=True,
  62. message=result["message"],
  63. sign_flow_id=result.get("primary_sign_flow_id"),
  64. file_id=result.get("created_contracts", [{}])[0].get("file_id") if result.get("created_contracts") else None,
  65. contract_url=result.get("created_contracts", [{}])[0].get("contract_url") if result.get("created_contracts") else None,
  66. created_contracts=result.get("created_contracts"),
  67. )