Commit 11237c65 authored by xianyang's avatar xianyang

优化

parent 6a4792d4
......@@ -468,12 +468,11 @@ class AccountStatistics(object):
total = len(ultimately_data)
res = ultimately_data[int(self.page - 1) * self.size: self.page * self.size]
# 判断是列表还是导出接口
type_name = query_fi_account_type()
if is_list:
if not res:
return [], 0, 0
for i in res:
i['reference_name'] = type_name[i['reference_type']] if type_name.get(i['reference_type']) else i[
i['reference_name'] = TYPE_NAME[i['reference_type']] if TYPE_NAME.get(i['reference_type']) else i[
'reference_type']
data_pd = pd.DataFrame(ultimately_data)
amount_total = data_pd['amount'].sum()
......@@ -532,18 +531,18 @@ def delete_specify_field(data, unique_tag):
for i in data:
if unique_tag in ["knapsack_account", "user_account", "guild_account", "pledgeDeduction"]:
structure = {
"uuid": i["uuid"],
"income": i["income"],
"outcome": i["outcome"],
"create_time": i["create_time"]
"uuid": i.get('uuid', ''),
"income": i.get('income', ''),
"outcome": i.get('outcome', ''),
"create_time": i.get('create_time', '')
}
else:
structure = {
"reference_number": i["reference_number"],
"reference_number": i.get('reference_number', ''),
"type": '出账' if i["type"] == 0 else '入账',
"reference_type": i["reference_type"],
"reference_type": i.get('reference_type', ''),
"amount": round(float(i["amount"]), 3),
"create_time": i["create_time"]
"create_time": i.get('create_time', '')
}
res_list.append(structure)
return res_list
......@@ -607,9 +606,8 @@ class SpecificAccountQuery(object):
res = self.total_list[int(self.page - 1) * self.size: self.page * self.size]
if not res:
return [], 0, 0
type_name = query_fi_account_type()
for i in res:
i['reference_name'] = type_name[i['reference_type']] if type_name.get(i['reference_type']) else i[
i['reference_name'] = TYPE_NAME[i['reference_type']] if TYPE_NAME.get(i['reference_type']) else i[
'reference_type']
data_pd = pd.DataFrame(self.total_list)
amount_total = data_pd['amount'].sum()
......
......@@ -7,7 +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.export import Export, TableToFile
from libs.functions import get_date_list
from libs.log_utils import Logger
from libs.result_format import HttpResultResponse, HttpMessage
......@@ -109,7 +109,8 @@ def finance_info_excel(data: schemas.FinanceDetails, request: Request,
else:
field_head = ['订单号', '出入账方式', '礼物类型', '金额', '时间']
data = crud.delete_specify_field(statement_list, data.unique_tag)
return statement_crud.data_to_file(db, data, "财务明细", headers, field_head)
# return statement_crud.data_to_file(db, data, "财务明细", headers, field_head)
return TableToFile(db, data, "财务明细", headers, field_head).main_method()
@router.get("/finance/fourth/details")
......
......@@ -127,8 +127,7 @@ class CalculationMonthlyBill(object):
def kv_search(self):
"""查询筛选的key, value"""
k_list = []
type_name = query_fi_account_type()
for k, v in type_name.items():
for k, v in TYPE_NAME.items():
if v == self.name or self.name in v:
k_list.append(k)
return k_list
......@@ -272,8 +271,7 @@ class MonthDataDerive(object):
assert_list = []
if name:
k_list = []
type_name = query_fi_account_type()
for k, v in type_name.items():
for k, v in TYPE_NAME.items():
if v == name or name in v:
k_list.append(k)
if len(k_list) > 1:
......@@ -293,9 +291,8 @@ class MonthDataDerive(object):
for res in res_data:
if res["reference_type"] in self.derive_key:
continue
type_name = query_fi_account_type()
if res["reference_type"] in type_name:
name = type_name[res["reference_type"]]
if res["reference_type"] in TYPE_NAME:
name = TYPE_NAME[res["reference_type"]]
else:
name = res["reference_type"]
out = [i['money'] for i in res_data if i['reference_type'] == res["reference_type"] and i['type'] == 0]
......
......@@ -9,7 +9,11 @@ def query_fi_account_type():
res_data = LinkMysql(env.DB_3YV2).query_mysql(sql)
for i in res_data:
if not fi_type.get(i['keyValue']):
fi_type[i['keyValue']] = i['keyName']
try:
name, type = i['keyName'].split('-')
except Exception as e:
name = i['keyName']
fi_type[i['keyValue']] = name
return fi_type
......
......@@ -82,3 +82,64 @@ class Export(object):
Logger(40).logger.error("导出失败:%s" % str(e))
params["status"] = 2
crud.create_export_data(self.db, params, user)
class TableToFile(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.lock = threading.Lock()
def thread_task(self,bk, writer, sheet_name):
"""线程执行方法"""
self.lock.acquire()
bk.to_excel(writer, sheet_name=sheet_name, index=False)
self.lock.release()
def main_method(self):
"""主函数"""
Logger().logger.info('开始导出')
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
crud.create_export_data(self.db, params, user)
Logger().logger.info(f'导出没有数据')
return None
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')
with pd.ExcelWriter(f'static/{self.name}.xlsx') as writer:
# bk.to_excel(writer, sheet_name='Sheet1', index=False)
threads = []
rows_per_thread = math.ceil(len(write_data) / 5)
for i in range(5):
sheet_name = 'sheet' + str(i + 1)
threads.append(threading.Thread(target=self.thread_task,
args=[bk.iloc[i * rows_per_thread: rows_per_thread * (i+1)], writer, sheet_name]))
# 启动线程
for y in threads:
y.start()
# 等待所有线程完成
for z in threads:
z.join()
file = open(writer, 'rb')
# 记录导出
crud.create_export_data(self.db, params, user)
return StreamingResponse(file,
media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
except Exception as e:
Logger().logger.info(f'导出异常:{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