You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.7 KiB
103 lines
3.7 KiB
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")
|
|
async def disburse_list(days: int):
|
|
select_query = """SELECT DATE(create_at) AS create_date, SUM(disburseprice) AS total_disburseprice
|
|
FROM disburses
|
|
WHERE DATE(create_at) >= DATE_SUB(CURDATE(), INTERVAL %s DAY) -- 一周前的日期
|
|
GROUP BY DATE(create_at)
|
|
ORDER BY create_date ASC;"""
|
|
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):
|
|
select_query = """SELECT SUM(d.disburseprice) AS value,t.typename AS name FROM disburses d
|
|
JOIN disbursetypes t ON d.typeid = t.id
|
|
WHERE d.create_at >= DATE_SUB(CURDATE(), INTERVAL %s DAY)
|
|
GROUP BY t.typename
|
|
;"""
|
|
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
|
|
|
|
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")
|