Commit c43630d2 authored by xianyang's avatar xianyang

优化财务需求

parent 9a65ac18
import threading
import time
from concurrent.futures.thread import ThreadPoolExecutor
from datetime import datetime
import pandas as pd
from sqlalchemy import and_, func
from sqlalchemy.orm import Session
from app.api.account import schemas
from core.config.env import env
from libs.business import TYPE_NAME, query_fi_account_type
from libs.db_link import LinkMysql
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
from libs.log_utils import Logger
from libs.orm import QueryAllData
from models import account as models
from models.account import AccountFinance, AccountFinanceDetails, AccountType
locka = threading.Lock()
......@@ -90,7 +86,7 @@ class HDUd():
count = number[0].get("num")
else:
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)
else:
count_sql = f"select count(id) as num from fi_account where unique_tag!='anchor_account'"
......@@ -99,7 +95,7 @@ class HDUd():
count = number[0].get("num")
else:
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)
if not query_res:
return [], 0
......@@ -114,7 +110,7 @@ class HDUd():
# 等待全部结束,再结束
for z in range(len(query_res)):
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
......@@ -248,7 +244,10 @@ def get_finance_info(unique_tag, id, page, size, start_time, end_time, is_list=N
count = future1.result()
res = future2.result()
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)
res = result[int(page - 1) * size: page * size]
count = result
......@@ -480,6 +479,8 @@ class AccountStatistics(object):
amount_total = data_pd['amount'].sum()
return res, total, float(amount_total)
else:
for i in res:
i['reference_type'] = TYPE_NAME.get(i['reference_type'], i['reference_type'])
return res
def guild_calculation(self):
......@@ -647,7 +648,7 @@ class HomePageDisplay(object):
else:
acc_uuid = [i['uuid'] for i in acc_data if i['unique_tag'] == self.unique_tag]
if not acc_uuid:
print('没找到系统账户')
Logger(20).logger.info('没找到系统账户')
return [], 0, 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"
......
......@@ -7,6 +7,7 @@ from app.api.account import schemas, crud
from app.api.account.crud import AccountStatistics, SpecificAccountQuery, HomePageDisplay
from app.api.statement import crud as statement_crud
from libs import functions
from libs.export import Export
from libs.functions import get_date_list
from libs.log_utils import Logger
from libs.result_format import HttpResultResponse, HttpMessage
......@@ -71,7 +72,7 @@ def finance_info_excel(data: schemas.FinanceInfo, request: Request,
token=Depends(login_required), db: Session = Depends(get_db)):
"""账户财务详情导出"""
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 = ['账户余额', '入账', '出账', '时间']
return statement_crud.data_to_file(db, statement_list, "财务信息", headers, df)
......@@ -100,7 +101,7 @@ def finance_info_excel(data: schemas.FinanceDetails, request: Request,
token=Depends(login_required), db: Session = Depends(get_db)):
"""账户财务明细导出"""
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()
if data.unique_tag in ["knapsack_account", "user_account", "guild_account", "pledgeDeduction"]:
field_head = ['uuid', '入账', '出账', '时间']
......
......@@ -225,6 +225,14 @@ class CalculationMonthlyDetails(object):
num = future2.result()
total = future3.result()
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 [], 0, 0
......
......@@ -20,7 +20,7 @@ class StatementCreate(StatementBase):
class StatementList(BaseModel):
page: int = 1
size: int = 9999999
size: int = 99999999
start_time: Optional[str] = ""
end_time: 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