Files
LoveACE-EndF/loveace/router/endpoint/aac/credit.py
Sibuxiangx bbc86b8330 ⚒️ 重大重构 LoveACE V2
引入了 mongodb
对数据库进行了一定程度的数据加密
性能改善
代码简化
统一错误模型和响应
使用 apifox 作为文档
2025-11-20 20:44:25 +08:00

186 lines
7.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from typing import List
from fastapi import APIRouter, Depends
from fastapi.responses import JSONResponse
from httpx import Headers, HTTPError
from pydantic import ValidationError
from loveace.router.endpoint.aac.model.base import AACConfig
from loveace.router.endpoint.aac.model.credit import (
LoveACCreditCategory,
LoveACCreditInfo,
)
from loveace.router.endpoint.aac.utils.aac_ticket import get_aac_header
from loveace.router.schemas.error import ProtectRouterErrorToCode
from loveace.router.schemas.uniresponse import UniResponseModel
from loveace.service.remote.aufe import AUFEConnection
from loveace.service.remote.aufe.depends import get_aufe_conn
aac_credit_router = APIRouter(
prefix="/credit",
responses=ProtectRouterErrorToCode().gen_code_table(),
)
ENDPOINT = {
"total_score": "/User/Center/DoGetScoreInfo?sf_request_type=ajax",
"score_list": "/User/Center/DoGetScoreList?sf_request_type=ajax",
}
@aac_credit_router.get(
"/info",
response_model=UniResponseModel[LoveACCreditInfo],
summary="获取爱安财总分信息",
)
async def get_credit_info(
conn: AUFEConnection = Depends(get_aufe_conn),
headers: Headers = Depends(get_aac_header),
) -> UniResponseModel[LoveACCreditInfo] | JSONResponse:
"""
获取用户的爱安财总分信息
✅ 功能特性:
- 获取爱安财总分和毕业要求状态
- 获取未达标的原因说明
- 实时从 AUFE 服务获取最新数据
💡 使用场景:
- 个人中心显示爱安财总分
- 检查是否满足毕业要求
- 了解分数不足的原因
Returns:
LoveACCreditInfo: 包含总分、达成状态和详细信息
"""
try:
conn.logger.info("开始获取爱安财总分信息")
response = await conn.client.post(
url=AACConfig().to_full_url(ENDPOINT["total_score"]),
data={},
headers=headers,
timeout=6000,
)
if response.status_code != 200:
conn.logger.error(
f"获取爱安财总分信息失败HTTP状态码: {response.status_code}"
)
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息失败,请稍后重试"
)
data = response.json()
if data.get("code") != 0:
conn.logger.error(f"获取爱安财总分信息失败,响应代码: {data.get('code')}")
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息失败,请稍后重试"
)
data = data.get("data", {})
if not data:
conn.logger.error("获取爱安财总分信息失败,响应数据为空")
return ProtectRouterErrorToCode().null_response.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息失败,请稍后重试"
)
try:
credit_info = LoveACCreditInfo.model_validate(data)
conn.logger.info("成功获取爱安财总分信息")
return UniResponseModel[LoveACCreditInfo](
success=True,
data=credit_info,
message="获取爱安财总分信息成功",
error=None,
)
except ValidationError as ve:
conn.logger.error(f"解析爱安财总分信息失败: {str(ve)}")
return ProtectRouterErrorToCode().validation_error.to_json_response(
conn.logger.trace_id, "解析爱安财总分信息失败,请稍后重试"
)
except HTTPError as he:
conn.logger.error(f"获取爱安财总分信息异常: {str(he)}")
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息异常,请稍后重试"
)
except Exception as e:
conn.logger.error(f"获取爱安财总分信息未知异常: {str(e)}")
return ProtectRouterErrorToCode().unknown_error.to_json_response(
conn.logger.trace_id, "获取爱安财总分信息未知异常,请稍后重试"
)
@aac_credit_router.get(
"/list",
response_model=UniResponseModel[List[LoveACCreditCategory]],
summary="获取爱安财分数明细",
)
async def get_credit_list(
conn: AUFEConnection = Depends(get_aufe_conn),
headers: Headers = Depends(get_aac_header),
) -> UniResponseModel[List[LoveACCreditCategory]] | JSONResponse:
"""
获取用户的爱安财分数明细列表
✅ 功能特性:
- 获取分数的详细分类信息
- 显示每个分数项的具体内容
- 支持分页查询
💡 使用场景:
- 查看分数明细页面
- 了解各类别分数构成
- 分析分数不足的原因
Returns:
list[LoveACCreditCategory]: 分数分类列表,每个分类包含多个分数项
"""
try:
conn.logger.info("开始获取爱安财分数明细")
response = await conn.client.post(
url=AACConfig().to_full_url(ENDPOINT["score_list"]),
data={"pageIndex": "1", "pageSize": "10"},
headers=headers,
timeout=6000,
)
if response.status_code != 200:
conn.logger.error(
f"获取爱安财分数明细失败HTTP状态码: {response.status_code}"
)
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细失败,请稍后重试"
)
data = response.json()
if data.get("code") != 0:
conn.logger.error(f"获取爱安财分数明细失败,响应代码: {data.get('code')}")
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细失败,请稍后重试"
)
data = data.get("data", [])
if not data:
conn.logger.error("获取爱安财分数明细失败,响应数据为空")
return ProtectRouterErrorToCode().null_response.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细失败,请稍后重试"
)
try:
credit_list = [LoveACCreditCategory.model_validate(item) for item in data]
conn.logger.info("成功获取爱安财分数明细")
return UniResponseModel[List[LoveACCreditCategory]](
success=True,
data=credit_list,
message="获取爱安财分数明细成功",
error=None,
)
except ValidationError as ve:
conn.logger.error(f"解析爱安财分数明细失败: {str(ve)}")
return ProtectRouterErrorToCode().validation_error.to_json_response(
conn.logger.trace_id, "解析爱安财分数明细失败,请稍后重试"
)
except HTTPError as he:
conn.logger.error(f"获取爱安财分数明细异常: {str(he)}")
return ProtectRouterErrorToCode().remote_service_error.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细异常,请稍后重试"
)
except Exception as e:
conn.logger.error(f"获取爱安财分数明细未知异常: {str(e)}")
return ProtectRouterErrorToCode().unknown_error.to_json_response(
conn.logger.trace_id, "获取爱安财分数明细未知异常,请稍后重试"
)