diff --git a/routers/disbursemanage.py b/routers/disbursemanage.py index df47377..3fa71ca 100644 --- a/routers/disbursemanage.py +++ b/routers/disbursemanage.py @@ -2,12 +2,11 @@ from fastapi import Depends, APIRouter, status, Query, Path, HTTPException from internal.models import * from internal.database import fetch_one, fetch_all, execute_query, response_success, raise_if_exists, raise_if_not_found from dependencies import get_current_active_user - +from datetime import datetime router = APIRouter( prefix="/disburses", tags=['支出管理'] ) -# 获取列表 @router.get("/list/specificdate") @@ -20,8 +19,6 @@ async def disburse_list(days: int): disburse_list = fetch_all(select_query, (days-1,)) return response_success(disburse_list, "disburse get list success") -# 获取列表 - @router.get("/list/classifieddata") async def classified_list(days: int): @@ -33,15 +30,74 @@ async def classified_list(days: int): classified_list = fetch_all(select_query, (days-1,)) return response_success(classified_list, "disburse get list success") -# 单条数据查询 +@router.get("/list/consume") +async def consume_list(days: int): + current_year = datetime.now().year + target_year = current_year - days + + select_query = f""" + SELECT SUM(d.disburseprice) AS data, t.typename AS name, DATE_FORMAT(d.create_at, '%Y-%m') AS date + FROM disburses d JOIN disbursetypes t ON d.typeid = t.id + WHERE YEAR(d.create_at) = {target_year} + GROUP BY t.typename, DATE_FORMAT(d.create_at, '%Y-%m') + ORDER BY DATE_FORMAT(d.create_at, '%Y-%m'); + """ + consume_list = fetch_all(select_query) + result = {} + for entry in consume_list: + name = entry['name'] + date = entry['date'] + data = entry['data'] + + if name not in result: + result[name] = [0] * 12 + + month_index = int(date.split('-')[1]) - 1 + result[name][month_index] = data + + final_result = [{"name": name, "data": data} + for name, data in result.items()] + return response_success(final_result, "disburse get list success") + + +@router.get("/list/calendar") +async def calendar_list(): + select_query = """ + SELECT t.typename AS NAME, YEAR(d.create_at) AS YEAR, SUM(d.disburseprice) AS total_amount + FROM disburses d + JOIN disbursetypes t ON d.typeid = t.id + GROUP BY t.typename, YEAR(d.create_at) + ORDER BY t.typename, YEAR(d.create_at); + """ + calendar_list = fetch_all(select_query) + + # Initialize dictionaries to store the transformed data + transformed_data = {} + years = set() + + # Process each row from the query result + for row in calendar_list: + name = row['NAME'] + year = row['YEAR'] + total_amount = row['total_amount'] + + if name not in transformed_data: + transformed_data[name] = {} + + transformed_data[name][year] = total_amount + years.add(year) + + # Prepare the final result in the desired format + sorted_years = sorted(years) # Sort years in ascending order + headers = ['name'] + [str(year) for year in sorted_years] # Create headers + + final_result = [headers] # Initialize with headers -@router.get("/list/search") -async def disburse_search(header: str = Query(description="支出标题")): - select_query = "SELECT id,header,text,descr FROM disburses WHERE 1=1 " - params = [] - if header: - select_query += "AND header LIKE %s" - params.append(f"%{header}%") - disburse_query = fetch_all(select_query, params=params, fetchall=True) - return response_success(data=disburse_query, message="disburse search success") + for name, year_data in transformed_data.items(): + row = [name] + for year in sorted_years: + row.append(year_data.get(year, 0)) # Append data or 0 if not available + final_result.append(row) + + return response_success(final_result, "disburse get list success")