Sfoglia il codice sorgente

/get_esign_templates 接口

mengqiankang 2 mesi fa
parent
commit
af8a5cdc36

+ 1 - 0
alien_snowflake/README.md

@@ -53,3 +53,4 @@ pk = gen.next_id()
 
 
 
+

+ 1 - 0
alien_snowflake/__init__.py

@@ -13,3 +13,4 @@ __all__ = [
 ]
 
 
+

+ 25 - 1
alien_store/api/router.py

@@ -1,8 +1,32 @@
 from fastapi import APIRouter
-
+from fastapi.params import Depends
+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 json
 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"]
+    except Exception:
+        return {"success": False, "message": "e签宝返回缺少 fileDownloadUrl", "raw": res_data}
+
+    # pydantic v2 使用 model_copy 更新字段
+    data_with_url = templates_data.model_copy(update={"contract_url": contract_url, "seal_url": None})
+    return templates_server.create_template(data_with_url)

+ 16 - 0
alien_store/repositories/contract_repo.py

@@ -14,5 +14,21 @@ class ContractRepository:
         """根据店铺id查询所有合同"""
         return self.db.query(ContractStore).filter(ContractStore.id == store_id).all()
 
+    def create(self, user_data):
+        """创建未签署合同模板"""
+        db_templates = ContractStore(
+            store_id = user_data.store_id,
+            merchant_name = user_data.merchant_name,
+            contact_phone = user_data.contact_phone,
+            contract_url = user_data.contract_url,
+            seal_url = user_data.seal_url
+        )
+        self.db.add(db_templates)
+        self.db.commit()
+        self.db.refresh(db_templates)
+        return db_templates
+
+
+
 
 

+ 13 - 0
alien_store/schemas/request/contract_store.py

@@ -0,0 +1,13 @@
+from pydantic import BaseModel, EmailStr, Field, field_validator
+
+
+
+class TemplatesCreate(BaseModel):
+    """模板创建请求模型"""
+    store_id: int = Field(description="入驻店铺ID")
+    business_segment: str = Field(description="入驻店铺经营板块")
+    merchant_name: str = Field(description="商家姓名")
+    contact_phone: str = Field(description="联系电话")
+    contract_url: str | None = Field(default=None, description="合同下载地址")
+    seal_url: str | None = Field(default=None, description="印章文件地址")
+

+ 6 - 2
alien_store/services/contract_server.py

@@ -1,8 +1,12 @@
 from sqlalchemy.orm import Session
 from alien_store.repositories.contract_repo import ContractRepository
-
+from alien_store.schemas.request.contract_store import TemplatesCreate
 
 class ContractServer:
     def __init__(self, db: Session):
         self.db = db
-        self.esign_repo = ContractRepository(db)
+        self.esign_repo = ContractRepository(db)
+
+    def create_template(self, template_data: TemplatesCreate):
+        template = self.esign_repo.create(template_data)
+        return {"message": "模板创建成功"}

+ 1 - 2
common/esigntool/esign_algorithm.py

@@ -4,7 +4,6 @@ import hmac
 from functools import wraps
 from hashlib import sha256
 import time
-from esign_emun import httpMethodEnum
 import logging
 import json
 from urllib.parse import urlparse, parse_qs, urlencode
@@ -131,7 +130,7 @@ def buildSignJsonHeader(appid, secret, http_method, url, body=None,
     """
     content_md5 = ""
     # 判断是PUT或者POST请求,不需要计算计算md5,否则md5为空
-    if httpMethodEnum.PUT == http_method or httpMethodEnum.POST == http_method:
+    if "PUT" == http_method or "POST" == http_method:
         # 字典转json字符串(去空格,保证与发送一致)
         body = json.dumps(body, separators=(",", ":"), ensure_ascii=False)
         # 生成md5

+ 0 - 1
common/esigntool/esign_config.py

@@ -1,4 +1,3 @@
-from esign_algorithm import buildHeader
 
 # 公共参数配置类
 class Config:

+ 3 - 2
common/esigntool/main.py

@@ -38,7 +38,7 @@ def get_template_detail():
     print(resp.text)
 
 
-def fill_in_template():
+def fill_in_template(name):
     """填写模板生成文件"""
     api_path = "/v3/files/create-by-doc-template"
     method = "POST"
@@ -52,7 +52,7 @@ def fill_in_template():
             },
             {
                 "componentKey": "store_name",
-                "componentValue": "潘子"
+                "componentValue": name
             },
             {
                 "componentKey": "date",
@@ -66,3 +66,4 @@ def fill_in_template():
     print(resp.text)
     return resp.text
 
+fill_in_template("哈哈")

+ 1 - 0
pyproject.toml

@@ -21,6 +21,7 @@ httpx = "^0.26.0"
 pymysql = "^1.1.0"
 redis = "^5.0.1"
 requests = "^2.32.5"
+aiomysql = "^0.3.2"
 
 [build-system]
 requires = ["poetry-core>=1.0.0"]