Commit a603b921 authored by xianyang's avatar xianyang

优化导出,从cos下载

parent 8d8f8c0f
import json import json
from typing import Optional from typing import Optional
from fastapi import Depends, APIRouter, Request, Query from fastapi import Depends, APIRouter, Request, Query
from fastapi.responses import RedirectResponse
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app import get_db from app import get_db
from app.api.account import schemas, crud from app.api.account import schemas, crud
...@@ -115,7 +116,8 @@ def finance_info_excel(data: schemas.FinanceDetails, request: Request, ...@@ -115,7 +116,8 @@ def finance_info_excel(data: schemas.FinanceDetails, request: Request,
field_head = ['订单号', '出入账方式', '礼物类型', '金额', '时间'] field_head = ['订单号', '出入账方式', '礼物类型', '金额', '时间']
data = crud.delete_specify_field(statement_list, data.unique_tag) 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() url = TableToFile(db, data, "财务明细", headers, field_head).main_method()
return HttpResultResponse(data=url)
@router.get("/finance/fourth/details") @router.get("/finance/fourth/details")
......
...@@ -34,6 +34,7 @@ config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Toke ...@@ -34,6 +34,7 @@ config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Toke
client = CosS3Client(config) client = CosS3Client(config)
COS_PATH = 'https://fj-dc-test-1256890024.cos.ap-guangzhou.myqcloud.com' # 测试 COS_PATH = 'https://fj-dc-test-1256890024.cos.ap-guangzhou.myqcloud.com' # 测试
COS_RERURN_PATH = '/images/' COS_RERURN_PATH = '/images/'
tencent = apo.get("TencentCloud")
class Env(BaseSettings): class Env(BaseSettings):
...@@ -70,6 +71,10 @@ class TestingEnv(Env): ...@@ -70,6 +71,10 @@ class TestingEnv(Env):
CLEARING_CENTER_PORT: int = 5454 CLEARING_CENTER_PORT: int = 5454
KEY = "dK8tZ1jM0wA6oE3j" KEY = "dK8tZ1jM0wA6oE3j"
PHP_URL = "http://106.55.103.148:8787" PHP_URL = "http://106.55.103.148:8787"
TX_SECRET_ID = tencent.get("secret_id")
TX_SECRET_KEY = tencent.get("secret_key")
TX_REGION = tencent.get("region")
TX_BUCKET = tencent.get("bucket")
class ProdEnv(Env): class ProdEnv(Env):
...@@ -95,6 +100,10 @@ class ProdEnv(Env): ...@@ -95,6 +100,10 @@ class ProdEnv(Env):
CLEARING_CENTER_PORT: int = 5454 CLEARING_CENTER_PORT: int = 5454
KEY = "dK8tZ1jM0wA6oE3j" KEY = "dK8tZ1jM0wA6oE3j"
PHP_URL = "http://219.152.95.226:6750" PHP_URL = "http://219.152.95.226:6750"
TX_SECRET_ID = tencent.get("secret_id")
TX_SECRET_KEY = tencent.get("secret_key")
TX_REGION = tencent.get("region")
TX_BUCKET = tencent.get("bucket")
env = TestingEnv() # 开发环境 env = TestingEnv() # 开发环境
......
...@@ -60,3 +60,31 @@ class LinkMysql(object): ...@@ -60,3 +60,31 @@ class LinkMysql(object):
# rb_info = pika.PlainCredentials(rb.get('username'), rb.get('password')) # rb_info = pika.PlainCredentials(rb.get('username'), rb.get('password'))
# self.connection = pika.BlockingConnection(parameters=pika.ConnectionParameters(rb.get('host'), rb.get('port'), rb.get('vhost'), rb_info)) # self.connection = pika.BlockingConnection(parameters=pika.ConnectionParameters(rb.get('host'), rb.get('port'), rb.get('vhost'), rb_info))
# self.channel = self.connection.channel() # self.channel = self.connection.channel()
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
# 连接服务器
class LinkMonitor(object):
def __init__(self):
conn = CosConfig(Region=env.TX_REGION, SecretId=env.TX_SECRET_ID, SecretKey=env.TX_SECRET_KEY,
Token=None, Scheme='https')
self.client = CosS3Client(conn)
# 断点上传
def upload_block(self, path, key, folder=""):
# 正常情况日志级别使用INFO,需要定位时可以修改为DEBUG,此时SDK会打印和服务端的通信信息
# logging.basicConfig(level=logging.INFO, stream=sys.stdout)
token = None
scheme = 'https' # 指定使用 http/https 协议来访问 COS,默认为 https,可不填
response = self.client.upload_file(
Bucket=env.TX_BUCKET,
Key=folder + key + '.xlsx',
LocalFilePath=path,
EnableMD5=False,
progress_callback=None
)
...@@ -10,6 +10,8 @@ from app.api.statement.guild import query_token ...@@ -10,6 +10,8 @@ from app.api.statement.guild import query_token
from starlette.responses import StreamingResponse from starlette.responses import StreamingResponse
from datetime import datetime from datetime import datetime
from app.api.export import crud from app.api.export import crud
from core.config.env import env
from libs.db_link import LinkMonitor
from libs.log_utils import Logger from libs.log_utils import Logger
...@@ -192,6 +194,51 @@ class TableToFile(object): ...@@ -192,6 +194,51 @@ class TableToFile(object):
# Logger().logger.info(f"返回压缩文件!!!") # Logger().logger.info(f"返回压缩文件!!!")
# return response # return response
# 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()
# # 记录导出
# crud.create_export_data(self.db, params, user)
# import zipfile
# with zipfile.ZipFile('ceshi.zip', 'w') as zip:
# # 将指定文件添加到压缩文件中
# zip.write(f"static/{self.name}.xlsx")
# return
# except Exception as e:
# Logger().logger.info(f'导出异常:{str(e)}')
# params["status"] = 2
# crud.create_export_data(self.db, params, user)
from fastapi.responses import RedirectResponse
def main_method(self): def main_method(self):
"""主函数""" """主函数"""
Logger().logger.info('开始导出') Logger().logger.info('开始导出')
...@@ -224,13 +271,13 @@ class TableToFile(object): ...@@ -224,13 +271,13 @@ class TableToFile(object):
# 等待所有线程完成 # 等待所有线程完成
for z in threads: for z in threads:
z.join() z.join()
file = open(writer, 'rb') SITE_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
LinkMonitor().upload_block(f'{SITE_ROOT}/static/{self.name}.xlsx', self.name, 'finance/')
# 记录导出 # 记录导出
crud.create_export_data(self.db, params, user) crud.create_export_data(self.db, params, user)
return StreamingResponse(file,
media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
except Exception as e: except Exception as e:
Logger().logger.info(f'导出异常:{str(e)}') Logger().logger.info(f'导出异常:{str(e)}')
params["status"] = 2 params["status"] = 2
crud.create_export_data(self.db, params, user) crud.create_export_data(self.db, params, user)
return f"https://{env.TX_BUCKET}.cos.ap-guangzhou.myqcloud.com/finance/{self.name}.xlsx"
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