增加用户账户相关接口

This commit is contained in:
aaron 2025-01-19 23:35:13 +08:00
parent 2bd1b3dafc
commit 9b44fdf36b
2 changed files with 151 additions and 5 deletions

View File

@ -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
})

View File

@ -1,6 +1,6 @@
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware 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 app.models.database import Base, engine
from fastapi.exceptions import RequestValidationError from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse 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(wechat.router,prefix="/api/wechat",tags=["微信"])
app.include_router(user.router, prefix="/api/user", tags=["用户"]) app.include_router(user.router, prefix="/api/user", tags=["用户"])
app.include_router(point.router, prefix="/api/point", 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(address.router, prefix="/api/address", tags=["配送地址"])
app.include_router(community.router, prefix="/api/community", tags=["社区"]) app.include_router(community.router, prefix="/api/community", tags=["社区"])
app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"]) app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"])
app.include_router(station.router, prefix="/api/station", tags=["驿站"]) app.include_router(station.router, prefix="/api/station", tags=["驿站"])
app.include_router(order.router, prefix="/api/order", 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.router, prefix="/api/merchant", tags=["商家"])
app.include_router(merchant_category.router, prefix="/api/merchant-categories", tags=["商家分类"]) app.include_router(merchant_category.router, prefix="/api/merchant-categories", tags=["商家分类"])
app.include_router(merchant_product.router, prefix="/api/merchant/product", 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(config.router, prefix="/api/config", tags=["系统配置"])
app.include_router(log.router, prefix="/api/logs", tags=["系统日志"]) app.include_router(log.router, prefix="/api/logs", tags=["系统日志"])
@app.get("/") @app.get("/")
async def root(): async def root():
return {"message": "欢迎使用 FastAPI!"} return {"message": "欢迎使用 Beefast 蜂快到家 API"}
@app.get("/health") @app.get("/health")
async def health_check(): async def health_check():