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

8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
  1. from fastapi import Depends, APIRouter, status, Query, Path, HTTPException
  2. from internal.models import *
  3. from internal.database import fetch_one, fetch_all, execute_query, response_success, raise_if_exists, raise_if_not_found
  4. from dependencies import get_current_active_user
  5. from datetime import datetime
  6. router = APIRouter(
  7. prefix="/disburses",
  8. tags=['支出管理']
  9. )
  10. @router.get("/list/specificdate")
  11. async def disburse_list(days: int):
  12. select_query = """SELECT DATE(create_at) AS create_date, SUM(disburseprice) AS total_disburseprice
  13. FROM disburses
  14. WHERE DATE(create_at) >= DATE_SUB(CURDATE(), INTERVAL %s DAY) --
  15. GROUP BY DATE(create_at)
  16. ORDER BY create_date ASC;"""
  17. disburse_list = fetch_all(select_query, (days-1,))
  18. return response_success(disburse_list, "disburse get list success")
  19. @router.get("/list/classifieddata")
  20. async def classified_list(days: int):
  21. select_query = """SELECT SUM(d.disburseprice) AS value,t.typename AS name FROM disburses d
  22. JOIN disbursetypes t ON d.typeid = t.id
  23. WHERE d.create_at >= DATE_SUB(CURDATE(), INTERVAL %s DAY)
  24. GROUP BY t.typename
  25. ;"""
  26. classified_list = fetch_all(select_query, (days-1,))
  27. return response_success(classified_list, "disburse get list success")
  28. @router.get("/list/consume")
  29. async def consume_list(days: int):
  30. current_year = datetime.now().year
  31. target_year = current_year - days
  32. select_query = f"""
  33. SELECT SUM(d.disburseprice) AS data, t.typename AS name, DATE_FORMAT(d.create_at, '%Y-%m') AS date
  34. FROM disburses d JOIN disbursetypes t ON d.typeid = t.id
  35. WHERE YEAR(d.create_at) = {target_year}
  36. GROUP BY t.typename, DATE_FORMAT(d.create_at, '%Y-%m')
  37. ORDER BY DATE_FORMAT(d.create_at, '%Y-%m');
  38. """
  39. consume_list = fetch_all(select_query)
  40. result = {}
  41. for entry in consume_list:
  42. name = entry['name']
  43. date = entry['date']
  44. data = entry['data']
  45. if name not in result:
  46. result[name] = [0] * 12
  47. month_index = int(date.split('-')[1]) - 1
  48. result[name][month_index] = data
  49. final_result = [{"name": name, "data": data}
  50. for name, data in result.items()]
  51. return response_success(final_result, "disburse get list success")
  52. @router.get("/list/calendar")
  53. async def calendar_list():
  54. select_query = """
  55. SELECT t.typename AS NAME, YEAR(d.create_at) AS YEAR, SUM(d.disburseprice) AS total_amount
  56. FROM disburses d
  57. JOIN disbursetypes t ON d.typeid = t.id
  58. GROUP BY t.typename, YEAR(d.create_at)
  59. ORDER BY t.typename, YEAR(d.create_at);
  60. """
  61. calendar_list = fetch_all(select_query)
  62. # Initialize dictionaries to store the transformed data
  63. transformed_data = {}
  64. years = set()
  65. # Process each row from the query result
  66. for row in calendar_list:
  67. name = row['NAME']
  68. year = row['YEAR']
  69. total_amount = row['total_amount']
  70. if name not in transformed_data:
  71. transformed_data[name] = {}
  72. transformed_data[name][year] = total_amount
  73. years.add(year)
  74. # Prepare the final result in the desired format
  75. sorted_years = sorted(years) # Sort years in ascending order
  76. headers = ['name'] + [str(year) for year in sorted_years] # Create headers
  77. final_result = [headers] # Initialize with headers
  78. for name, year_data in transformed_data.items():
  79. row = [name]
  80. for year in sorted_years:
  81. row.append(year_data.get(year, 0)) # Append data or 0 if not available
  82. final_result.append(row)
  83. return response_success(final_result, "disburse get list success")