From 9b44fdf36bc75cedd25b2a521910c542e09d9351 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sun, 19 Jan 2025 23:35:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/account.py | 147 +++++++++++++++++++++++++++++++++++ app/main.py | 9 +-- 2 files changed, 151 insertions(+), 5 deletions(-) create mode 100644 app/api/endpoints/account.py diff --git a/app/api/endpoints/account.py b/app/api/endpoints/account.py new file mode 100644 index 0000000..a85eca3 --- /dev/null +++ b/app/api/endpoints/account.py @@ -0,0 +1,147 @@ +from fastapi import APIRouter, Depends, Query +from sqlalchemy.orm import Session +from sqlalchemy import func, and_ +from app.models.database import get_db +from app.models.user_account import UserAccountDB, AccountDetailDB, AccountDetailType +from app.models.user import UserDB +from app.api.deps import get_current_user +from app.core.response import success_response, ResponseModel +from datetime import datetime, timedelta +from decimal import Decimal +from typing import Optional +from pydantic import BaseModel + +router = APIRouter() + +@router.get("/summary", response_model=ResponseModel) +async def account_summary( + db: Session = Depends(get_db), + current_user: UserDB = Depends(get_current_user) +): + """获取账户收益汇总""" + # 获取当前日期范围 + today = datetime.now().date() + yesterday = today - timedelta(days=1) + today_start = datetime.combine(today, datetime.min.time()) + today_end = datetime.combine(today, datetime.max.time()) + yesterday_start = datetime.combine(yesterday, datetime.min.time()) + yesterday_end = datetime.combine(yesterday, datetime.max.time()) + + # 查询账户余额 + account = db.query(UserAccountDB).filter( + UserAccountDB.user_id == current_user.userid + ).first() + balance = account.balance if account else Decimal('0') + + # 查询总收入记录数 + total = db.query(func.count(AccountDetailDB.id)).filter( + AccountDetailDB.user_id == current_user.userid, + AccountDetailDB.type == AccountDetailType.INCOME + ).scalar() or 0 + + # 查询今日收入记录数 + today_total = db.query(func.count(AccountDetailDB.id)).filter( + AccountDetailDB.user_id == current_user.userid, + AccountDetailDB.type == AccountDetailType.INCOME, + AccountDetailDB.create_time.between(today_start, today_end) + ).scalar() or 0 + + # 查询昨日收入记录数 + yesterday_total = db.query(func.count(AccountDetailDB.id)).filter( + AccountDetailDB.user_id == current_user.userid, + AccountDetailDB.type == AccountDetailType.INCOME, + AccountDetailDB.create_time.between(yesterday_start, yesterday_end) + ).scalar() or 0 + + # 查询总收入金额 + total_income = db.query(func.sum(AccountDetailDB.amount)).filter( + AccountDetailDB.user_id == current_user.userid, + AccountDetailDB.type == AccountDetailType.INCOME + ).scalar() or Decimal('0') + + # 查询今日收入金额 + today_income = db.query(func.sum(AccountDetailDB.amount)).filter( + AccountDetailDB.user_id == current_user.userid, + AccountDetailDB.type == AccountDetailType.INCOME, + AccountDetailDB.create_time.between(today_start, today_end) + ).scalar() or Decimal('0') + + # 查询昨日收入金额 + yesterday_income = db.query(func.sum(AccountDetailDB.amount)).filter( + AccountDetailDB.user_id == current_user.userid, + AccountDetailDB.type == AccountDetailType.INCOME, + AccountDetailDB.create_time.between(yesterday_start, yesterday_end) + ).scalar() or Decimal('0') + + return success_response(data={ + "balance": float(balance), # 账户余额 + "total": total, # 总收入记录数 + "today_total": today_total, # 今日收入记录数 + "yesterday_total": yesterday_total, # 昨日收入记录数 + "total_income": float(total_income), # 总收入金额 + "today_income": float(today_income), # 今日收入金额 + "yesterday_income": float(yesterday_income) # 昨日收入金额 + }) + +# 添加 Pydantic 模型用于返回明细数据 +class AccountDetailItem(BaseModel): + id: int + amount: float + type: AccountDetailType + description: str + create_time: datetime + + class Config: + from_attributes = True + +@router.get("/details", response_model=ResponseModel) +async def list_account_details( + start_date: Optional[datetime] = Query(None, description="开始日期"), + end_date: Optional[datetime] = Query(None, description="结束日期"), + type: Optional[AccountDetailType] = Query(None, description="收支类型"), + skip: int = Query(0, description="跳过记录数"), + limit: int = Query(20, description="返回记录数"), + db: Session = Depends(get_db), + current_user: UserDB = Depends(get_current_user) +): + """获取账户明细列表""" + # 构建基础查询 + query = db.query(AccountDetailDB).filter( + AccountDetailDB.user_id == current_user.userid + ) + + # 添加日期范围过滤 + if start_date: + query = query.filter(AccountDetailDB.create_time >= start_date) + if end_date: + query = query.filter(AccountDetailDB.create_time <= end_date) + + # 添加类型过滤 + if type: + query = query.filter(AccountDetailDB.type == type) + + # 获取总数 + total = query.count() + + # 获取分页数据 + details = query.order_by(AccountDetailDB.create_time.desc())\ + .offset(skip)\ + .limit(limit)\ + .all() + + # 转换数据 + detail_list = [ + { + "id": detail.id, + "amount": float(detail.amount), + "type": detail.type, + "description": detail.description, + "create_time": detail.create_time + } + for detail in details + ] + + return success_response(data={ + "total": total, + "items": detail_list + }) \ No newline at end of file diff --git a/app/main.py b/app/main.py index 318daad..fadd751 100644 --- a/app/main.py +++ b/app/main.py @@ -1,6 +1,6 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log +from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account from app.models.database import Base, engine from fastapi.exceptions import RequestValidationError from fastapi.responses import JSONResponse @@ -33,12 +33,13 @@ app.add_middleware(RequestLoggerMiddleware) app.include_router(wechat.router,prefix="/api/wechat",tags=["微信"]) app.include_router(user.router, prefix="/api/user", tags=["用户"]) app.include_router(point.router, prefix="/api/point", tags=["用户积分"]) +app.include_router(account.router, prefix="/api/account", tags=["账户"]) app.include_router(address.router, prefix="/api/address", tags=["配送地址"]) app.include_router(community.router, prefix="/api/community", tags=["社区"]) app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"]) app.include_router(station.router, prefix="/api/station", tags=["驿站"]) app.include_router(order.router, prefix="/api/order", tags=["订单"]) -app.include_router(coupon.router, prefix="/api/coupon", tags=["跑腿券"]) +app.include_router(coupon.router, prefix="/api/coupon", tags=["服务券"]) app.include_router(merchant.router, prefix="/api/merchant", tags=["商家"]) app.include_router(merchant_category.router, prefix="/api/merchant-categories", tags=["商家分类"]) app.include_router(merchant_product.router, prefix="/api/merchant/product", tags=["商家产品"]) @@ -47,11 +48,9 @@ app.include_router(upload.router, prefix="/api/upload", tags=["文件上传"]) app.include_router(config.router, prefix="/api/config", tags=["系统配置"]) app.include_router(log.router, prefix="/api/logs", tags=["系统日志"]) - - @app.get("/") async def root(): - return {"message": "欢迎使用 FastAPI!"} + return {"message": "欢迎使用 Beefast 蜂快到家 API"} @app.get("/health") async def health_check():