From 3aa806ea6b39742ced5e70c664e2f93e92fb59de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=96=B9=E6=88=90?= Date: Thu, 2 Oct 2025 12:25:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(valuation):=20=E6=B7=BB=E5=8A=A0datetime?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E6=94=AF=E6=8C=81=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=BB=9F=E8=AE=A1=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为valuation模型添加json_encoders以支持datetime序列化 使用annotate替代原始SQL进行统计查询计数 在API响应中使用model_dump_json确保datetime正确序列化 --- app/api/v1/app_valuations/app_valuations.py | 15 ++++++++++++--- app/api/v1/valuations/valuations.py | 14 +++++++------- app/controllers/valuation.py | 5 +++-- app/schemas/valuation.py | 6 ++++++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/app/api/v1/app_valuations/app_valuations.py b/app/api/v1/app_valuations/app_valuations.py index 231e831..70c40f9 100644 --- a/app/api/v1/app_valuations/app_valuations.py +++ b/app/api/v1/app_valuations/app_valuations.py @@ -28,7 +28,10 @@ async def create_valuation( user_id=user_id, data=data ) - return Success(data=result, msg="估值评估申请提交成功") + # 使用model_dump_json()来正确序列化datetime,然后解析为dict + import json + result_dict = json.loads(result.model_dump_json()) + return Success(data=result_dict, msg="估值评估申请提交成功") except Exception as e: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, @@ -49,8 +52,11 @@ async def get_my_valuations( user_id=user_id, query=query ) + # 使用model_dump_json()来正确序列化datetime,然后解析为dict列表 + import json + serialized_items = [json.loads(item.model_dump_json()) for item in result.items] return SuccessExtra( - data=result.items, + data=serialized_items, total=result.total, page=result.page, size=result.size, @@ -84,7 +90,10 @@ async def get_valuation_detail( detail="估值评估记录不存在" ) - return Success(data=result, msg="获取估值评估详情成功") + # 使用model_dump_json()来正确序列化datetime,然后解析为dict + import json + result_dict = json.loads(result.model_dump_json()) + return Success(data=result_dict, msg="获取估值评估详情成功") except HTTPException: raise except Exception as e: diff --git a/app/api/v1/valuations/valuations.py b/app/api/v1/valuations/valuations.py index 9dcfcd5..de41ea6 100644 --- a/app/api/v1/valuations/valuations.py +++ b/app/api/v1/valuations/valuations.py @@ -27,6 +27,13 @@ async def create_valuation(data: ValuationAssessmentCreate): raise HTTPException(status_code=400, detail=f"创建失败: {str(e)}") +@valuations_router.get("/statistics/overview", summary="获取统计信息") +async def get_statistics(): + """获取估值评估统计信息""" + result = await valuation_controller.get_statistics() + return Success(data=result, msg="获取统计信息成功") + + @valuations_router.get("/{valuation_id}", summary="获取估值评估详情") async def get_valuation(valuation_id: int): """根据ID获取估值评估详情""" @@ -105,13 +112,6 @@ async def search_valuations( ) -@valuations_router.get("/statistics/overview", summary="获取统计信息") -async def get_statistics(): - """获取估值评估统计信息""" - result = await valuation_controller.get_statistics() - return Success(data=result, msg="获取统计信息成功") - - # 批量操作接口 @valuations_router.post("/batch/delete", summary="批量删除估值评估") async def batch_delete_valuations(valuation_ids: list[int]): diff --git a/app/controllers/valuation.py b/app/controllers/valuation.py index 594d9ba..65228a3 100644 --- a/app/controllers/valuation.py +++ b/app/controllers/valuation.py @@ -1,6 +1,7 @@ from typing import List, Optional from tortoise.expressions import Q from tortoise.queryset import QuerySet +from tortoise.functions import Count from app.models.valuation import ValuationAssessment from app.schemas.valuation import ( @@ -107,13 +108,13 @@ class ValuationController: total_count = await self.model.filter(is_active=True).count() # 按行业统计 - industry_stats = await self.model.filter(is_active=True).group_by('industry').values('industry', count='COUNT(*)') + industry_stats = await self.model.filter(is_active=True).group_by('industry').annotate(count=Count('id')).values('industry', 'count') # 按非遗等级统计 heritage_level_stats = await self.model.filter( is_active=True, heritage_level__isnull=False - ).group_by('heritage_level').values('heritage_level', count='COUNT(*)') + ).group_by('heritage_level').annotate(count=Count('id')).values('heritage_level', 'count') return { 'total_count': total_count, diff --git a/app/schemas/valuation.py b/app/schemas/valuation.py index ec8a00a..df89576 100644 --- a/app/schemas/valuation.py +++ b/app/schemas/valuation.py @@ -121,6 +121,9 @@ class UserValuationOut(BaseModel): class Config: from_attributes = True + json_encoders = { + datetime: lambda v: v.isoformat() + } class UserValuationDetail(ValuationAssessmentBase): @@ -133,6 +136,9 @@ class UserValuationDetail(ValuationAssessmentBase): class Config: from_attributes = True + json_encoders = { + datetime: lambda v: v.isoformat() + } class UserValuationList(BaseModel):