186 lines
7.5 KiB
Python
186 lines
7.5 KiB
Python
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, "获取爱安财分数明细未知异常,请稍后重试"
|
||
)
|