c6206787da
项目结构: - backend/ Python FastAPI 后端 - uni-app/ uni-app跨端前端 - docs/ 设计文档 - docker-compose.yml Docker编排 - nginx/scripts/systemd 运维配置 已完成功能: - 用户认证 (JWT) - 智能翻译 + 回复建议 - 营销素材生成 - 客户管理 + 沉默检测 - 报价单管理 - 产品库管理 - 汇率换算 - 推送通知 (uni-push) - WhatsApp Webhook框架 - Celery定时任务
87 lines
2.5 KiB
Python
87 lines
2.5 KiB
Python
from fastapi import APIRouter, HTTPException
|
|
from typing import Optional, Dict, Any
|
|
from pydantic import BaseModel
|
|
from app.services.translation import TranslationService
|
|
from app.core.security import decode_token
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
class TranslateRequest(BaseModel):
|
|
text: str
|
|
target_lang: str
|
|
source_lang: Optional[str] = "auto"
|
|
context: Optional[str] = None
|
|
|
|
|
|
class ReplyRequest(BaseModel):
|
|
inquiry: str
|
|
tone: str = "professional"
|
|
count: int = 3
|
|
context: Optional[Dict[str, Any]] = None
|
|
|
|
|
|
class ExtractRequest(BaseModel):
|
|
text: str
|
|
extract_type: str = "auto"
|
|
|
|
|
|
@router.post("")
|
|
async def translate_text(data: TranslateRequest, authorization: str = None):
|
|
if not authorization or not authorization.startswith("Bearer "):
|
|
raise HTTPException(status_code=401, detail="Missing token")
|
|
|
|
payload = decode_token(authorization[7:])
|
|
user_id = payload.get("sub") if payload else None
|
|
|
|
service = TranslationService()
|
|
result = await service.translate(
|
|
text=data.text,
|
|
target_lang=data.target_lang,
|
|
source_lang=data.source_lang,
|
|
context=data.context,
|
|
user_id=user_id,
|
|
)
|
|
return result
|
|
|
|
|
|
@router.post("/reply")
|
|
async def generate_reply(data: ReplyRequest, authorization: str = None):
|
|
if not authorization or not authorization.startswith("Bearer "):
|
|
raise HTTPException(status_code=401, detail="Missing token")
|
|
|
|
service = TranslationService()
|
|
results = await service.generate_reply(
|
|
inquiry=data.inquiry,
|
|
context=data.context,
|
|
tone=data.tone,
|
|
count=data.count,
|
|
)
|
|
return {"suggestions": results, "inquiry": data.inquiry, "count": len(results)}
|
|
|
|
|
|
@router.post("/extract")
|
|
async def extract_info(data: ExtractRequest, authorization: str = None):
|
|
if not authorization or not authorization.startswith("Bearer "):
|
|
raise HTTPException(status_code=401, detail="Missing token")
|
|
|
|
service = TranslationService()
|
|
result = await service.extract_info(data.text, data.extract_type)
|
|
return {"extracted": result, "type": data.extract_type}
|
|
|
|
|
|
@router.post("/feedback")
|
|
async def feedback(data: dict, authorization: str = None):
|
|
if not authorization:
|
|
raise HTTPException(status_code=401, detail="Missing token")
|
|
|
|
from app.ai.trade_corpus import TradeCorpus
|
|
corpus = TradeCorpus()
|
|
|
|
entry_id = data.get("entry_id")
|
|
rating = data.get("rating")
|
|
if entry_id and rating:
|
|
await corpus.rate_entry(entry_id, rating)
|
|
|
|
return {"status": "ok"}
|