Commit c43630d2 authored by xianyang's avatar xianyang

优化财务需求

parent 9a65ac18
import threading import threading
import time import time
from concurrent.futures.thread import ThreadPoolExecutor from concurrent.futures.thread import ThreadPoolExecutor
from datetime import datetime
import pandas as pd import pandas as pd
from sqlalchemy import and_, func
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.api.account import schemas
from core.config.env import env from core.config.env import env
from libs.business import TYPE_NAME, query_fi_account_type from libs.business import TYPE_NAME, query_fi_account_type
from libs.db_link import LinkMysql from libs.db_link import LinkMysql
from libs.functions import wrapper_out, get_now_timestamp, uuid, get_before_timestamp, time_str_to_timestamp, \ from libs.functions import wrapper_out, get_now_timestamp, uuid, get_before_timestamp, time_str_to_timestamp, \
get_yesterday_timestamp, get_last_month, get_date_list, send_json_rpc_request, ymd_str_to_timestamp get_yesterday_timestamp, get_last_month, get_date_list, send_json_rpc_request, ymd_str_to_timestamp
from libs.log_utils import Logger from libs.log_utils import Logger
from libs.orm import QueryAllData
from models import account as models from models import account as models
from models.account import AccountFinance, AccountFinanceDetails, AccountType
locka = threading.Lock() locka = threading.Lock()
...@@ -90,7 +86,7 @@ class HDUd(): ...@@ -90,7 +86,7 @@ class HDUd():
count = number[0].get("num") count = number[0].get("num")
else: else:
count = 0 count = 0
data_sql = f"select id,name,unique_tag,uuid,config_key,beneficiary,description,create_time, income, output from fi_account where name like '%{name}%' and unique_tag!='anchor_account' ORDER BY id DESC LIMIT {(int(page) - 1) * size},{size}" data_sql = f"select id,name,unique_tag,uuid,config_key,beneficiary,description,create_time, income, output from fi_account where name like '%{name}%' and unique_tag!='anchor_account' ORDER BY id LIMIT {(int(page) - 1) * size},{size}"
query_res = LinkMysql(env.DB_3YV2).query_mysql(data_sql) query_res = LinkMysql(env.DB_3YV2).query_mysql(data_sql)
else: else:
count_sql = f"select count(id) as num from fi_account where unique_tag!='anchor_account'" count_sql = f"select count(id) as num from fi_account where unique_tag!='anchor_account'"
...@@ -99,7 +95,7 @@ class HDUd(): ...@@ -99,7 +95,7 @@ class HDUd():
count = number[0].get("num") count = number[0].get("num")
else: else:
count = 0 count = 0
data_sql = f"select id,name,unique_tag,uuid,config_key,beneficiary,description,create_time, income, output from fi_account where unique_tag!='anchor_account' ORDER BY id DESC LIMIT {(int(page) - 1) * size},{size}" data_sql = f"select id,name,unique_tag,uuid,config_key,beneficiary,description,create_time, income, output from fi_account where unique_tag!='anchor_account' ORDER BY id LIMIT {(int(page) - 1) * size},{size}"
query_res = LinkMysql(env.DB_3YV2).query_mysql(data_sql) query_res = LinkMysql(env.DB_3YV2).query_mysql(data_sql)
if not query_res: if not query_res:
return [], 0 return [], 0
...@@ -114,7 +110,7 @@ class HDUd(): ...@@ -114,7 +110,7 @@ class HDUd():
# 等待全部结束,再结束 # 等待全部结束,再结束
for z in range(len(query_res)): for z in range(len(query_res)):
ths[z].join() ths[z].join()
self.result_list.sort(key=lambda q: q['id'], reverse=True) self.result_list.sort(key=lambda q: q['id'], reverse=False)
return self.result_list, count return self.result_list, count
...@@ -248,7 +244,10 @@ def get_finance_info(unique_tag, id, page, size, start_time, end_time, is_list=N ...@@ -248,7 +244,10 @@ def get_finance_info(unique_tag, id, page, size, start_time, end_time, is_list=N
count = future1.result() count = future1.result()
res = future2.result() res = future2.result()
else: else:
sys_sql = f"select initial_money as balance,income,outcome,create_time from v2_system_account_statistics_copy where fi_account_id={id} ORDER BY create_time DESC" if finance_condition:
sys_sql = f"select initial_money as balance,income,outcome,create_time from v2_system_account_statistics_copy where fi_account_id={id} and {' and '.join(finance_condition)} ORDER BY create_time DESC"
else:
sys_sql = f"select initial_money as balance,income,outcome,create_time from v2_system_account_statistics_copy where fi_account_id={id} ORDER BY create_time DESC"
result = LinkMysql(env.DB_3YV2).query_mysql(sys_sql) result = LinkMysql(env.DB_3YV2).query_mysql(sys_sql)
res = result[int(page - 1) * size: page * size] res = result[int(page - 1) * size: page * size]
count = result count = result
...@@ -480,6 +479,8 @@ class AccountStatistics(object): ...@@ -480,6 +479,8 @@ class AccountStatistics(object):
amount_total = data_pd['amount'].sum() amount_total = data_pd['amount'].sum()
return res, total, float(amount_total) return res, total, float(amount_total)
else: else:
for i in res:
i['reference_type'] = TYPE_NAME.get(i['reference_type'], i['reference_type'])
return res return res
def guild_calculation(self): def guild_calculation(self):
...@@ -647,7 +648,7 @@ class HomePageDisplay(object): ...@@ -647,7 +648,7 @@ class HomePageDisplay(object):
else: else:
acc_uuid = [i['uuid'] for i in acc_data if i['unique_tag'] == self.unique_tag] acc_uuid = [i['uuid'] for i in acc_data if i['unique_tag'] == self.unique_tag]
if not acc_uuid: if not acc_uuid:
print('没找到系统账户') Logger(20).logger.info('没找到系统账户')
return [], 0, 0 return [], 0, 0
assets_cond.append(f" uuid='{acc_uuid[0]}'") assets_cond.append(f" uuid='{acc_uuid[0]}'")
assets_sql = f"select reference_type,type,sum(amount) as amount from {self.date} where {' and '.join(assets_cond)} GROUP BY reference_type,type" assets_sql = f"select reference_type,type,sum(amount) as amount from {self.date} where {' and '.join(assets_cond)} GROUP BY reference_type,type"
......
...@@ -7,6 +7,7 @@ from app.api.account import schemas, crud ...@@ -7,6 +7,7 @@ from app.api.account import schemas, crud
from app.api.account.crud import AccountStatistics, SpecificAccountQuery, HomePageDisplay from app.api.account.crud import AccountStatistics, SpecificAccountQuery, HomePageDisplay
from app.api.statement import crud as statement_crud from app.api.statement import crud as statement_crud
from libs import functions from libs import functions
from libs.export import Export
from libs.functions import get_date_list from libs.functions import get_date_list
from libs.log_utils import Logger from libs.log_utils import Logger
from libs.result_format import HttpResultResponse, HttpMessage from libs.result_format import HttpResultResponse, HttpMessage
...@@ -71,7 +72,7 @@ def finance_info_excel(data: schemas.FinanceInfo, request: Request, ...@@ -71,7 +72,7 @@ def finance_info_excel(data: schemas.FinanceInfo, request: Request,
token=Depends(login_required), db: Session = Depends(get_db)): token=Depends(login_required), db: Session = Depends(get_db)):
"""账户财务详情导出""" """账户财务详情导出"""
headers = request.get("headers") headers = request.get("headers")
statement_list = crud.get_finance_info(data.unique_tag, data.id, data.page, 99999, data.start_time, data.end_time) statement_list = crud.get_finance_info(data.unique_tag, data.id, data.page, 99999999, data.start_time, data.end_time)
df = ['账户余额', '入账', '出账', '时间'] df = ['账户余额', '入账', '出账', '时间']
return statement_crud.data_to_file(db, statement_list, "财务信息", headers, df) return statement_crud.data_to_file(db, statement_list, "财务信息", headers, df)
...@@ -100,7 +101,7 @@ def finance_info_excel(data: schemas.FinanceDetails, request: Request, ...@@ -100,7 +101,7 @@ def finance_info_excel(data: schemas.FinanceDetails, request: Request,
token=Depends(login_required), db: Session = Depends(get_db)): token=Depends(login_required), db: Session = Depends(get_db)):
"""账户财务明细导出""" """账户财务明细导出"""
headers = request.get("headers") headers = request.get("headers")
statement_list = AccountStatistics(data.page, 99999, data.uuid, data.user_id, data.start_time, data.end_time, data.type, statement_list = AccountStatistics(data.page, 99999999, data.uuid, data.user_id, data.start_time, data.end_time, data.type,
data.gift_type, data.unique_tag).get_finance_details() data.gift_type, data.unique_tag).get_finance_details()
if data.unique_tag in ["knapsack_account", "user_account", "guild_account", "pledgeDeduction"]: if data.unique_tag in ["knapsack_account", "user_account", "guild_account", "pledgeDeduction"]:
field_head = ['uuid', '入账', '出账', '时间'] field_head = ['uuid', '入账', '出账', '时间']
......
...@@ -225,6 +225,14 @@ class CalculationMonthlyDetails(object): ...@@ -225,6 +225,14 @@ class CalculationMonthlyDetails(object):
num = future2.result() num = future2.result()
total = future3.result() total = future3.result()
if data: if data:
for i in data:
if i['amount_type'] == 'consumable':
i['amount_type'] = '钻石'
if i['amount_type'] == 'withdrawable':
i['amount_type'] = '珍珠'
if i['amount_type'] == 'backpack':
i['amount_type'] = '背包'
i['reference_type'] = TYPE_NAME.get(param.get('key'), param.get('key'))
return data, num, float(total[0]['amount']) return data, num, float(total[0]['amount'])
return [], 0, 0 return [], 0, 0
......
...@@ -20,7 +20,7 @@ class StatementCreate(StatementBase): ...@@ -20,7 +20,7 @@ class StatementCreate(StatementBase):
class StatementList(BaseModel): class StatementList(BaseModel):
page: int = 1 page: int = 1
size: int = 9999999 size: int = 99999999
start_time: Optional[str] = "" start_time: Optional[str] = ""
end_time: Optional[str] = "" end_time: Optional[str] = ""
order_number: Optional[str] = "" order_number: Optional[str] = ""
......
import math
import time
import openpyxl
import threading
import pandas as pd
from app.api.statement.guild import query_token
from starlette.responses import StreamingResponse
from app.api.export import crud
from libs.log_utils import Logger
class Export(object):
def __init__(self, db, data, name, header, field_list):
self.db = db
self.data = data
self.name = name
self.header = header
self.field_list = field_list
self.lock = threading.Lock()
self.wb = openpyxl.Workbook() # 创建一个新的 Excel 文件
self.sheet = self.wb.active
def write_data(self, sheet, row, col, data):
sheet.cell(row=row, column=col, value=data)
# 定义写入任务
def write_task(self, start_row, end_row, data):
for row in range(start_row, end_row):
with self.lock:
index = 0
col = 1
if index < len(data):
for k, v in data[index].items():
self.write_data(self.sheet, row, col, v)
col += 1
index += 1
def data_to_file(self):
# 获取操作人
user = query_token(self.db, self.header)
params = {"source": self.name, "method": "data_to_file", "status": 1}
if len(self.data) == 0:
params["status"] = 3
try:
bk = pd.DataFrame(self.data)
if self.data[0].get('create_time'):
if isinstance(self.data[0]['create_time'], int):
bk['create_time'] = bk['create_time'].apply(
lambda x: time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(x)))
bk.columns = self.field_list # 修改pandas头
write_data = bk.to_dict(orient='records')
# 创建线程列表
threads = []
rows_per_thread = math.ceil(len(write_data) / 10)
# 写入头部
# self.wb
for i in self.field_list:
self.write_data(self.sheet, 1, self.field_list.index(i)+1, i)
# 启动线程
for i in range(10):
start_row = i*rows_per_thread + 2 + i
end_row = (i+1)*rows_per_thread + 2 + i
thread = threading.Thread(target=self.write_task, args=(start_row, end_row, write_data[i*rows_per_thread:(i+1)*rows_per_thread]))
thread.start()
threads.append(thread)
# 等待所有线程完成
for thread in threads:
thread.join()
crud.create_export_data(self.db, params, user)
# 保存 Excel 文件
self.wb.save(f'static/{self.name}.xlsx')
self.wb.close()
file = open(f'static/{self.name}.xlsx', 'rb')
return StreamingResponse(file,
media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
except Exception as e:
Logger(40).logger.error("导出失败:%s" % str(e))
params["status"] = 2
crud.create_export_data(self.db, params, user)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment