Commit 936f3778 authored by xianyang's avatar xianyang

导出接口实现

parent 303c3f13
......@@ -59,6 +59,3 @@ class AccountTypeUpdate(BaseModel):
class AccountTypeList(AccountTypeUpdate):
page: int = None
size: int = None
from fastapi import Depends, APIRouter
from fastapi import Depends, APIRouter, Request
from sqlalchemy.orm import Session
from app import get_db
from app.api.account import schemas, crud
......@@ -49,10 +49,11 @@ def finance_information(data: schemas.FinanceInfo, db: Session = Depends(get_db)
@router.post("/finance/info/excel")
def finance_info_excel(data: schemas.FinanceInfo, db: Session = Depends(get_db)):
def finance_info_excel(data: schemas.FinanceInfo, request: Request, db: Session = Depends(get_db)):
"""账户财务信息导出"""
headers = request.get("headers")
statement_list = crud.get_finance_info(db, data)
return statement_crud.data_to_file(statement_list, "财务信息")
return statement_crud.data_to_file(db, statement_list, "财务信息", headers)
@router.post("/finance/details")
......@@ -63,10 +64,11 @@ def finance_details(data: schemas.FinanceDetails, db: Session = Depends(get_db))
@router.post("/finance/details/excel")
def finance_info_excel(data: schemas.FinanceDetails, db: Session = Depends(get_db)):
def finance_info_excel(data: schemas.FinanceDetails, request: Request, db: Session = Depends(get_db)):
"""账户财务明细导出"""
headers = request.get("headers")
statement_list = crud.get_finance_details(db, data)
return statement_crud.data_to_file(statement_list, "财务明细")
return statement_crud.data_to_file(db, statement_list, "财务明细", headers)
@router.post("/type")
......
......@@ -4,6 +4,7 @@ from app.api.statement import views as s_view
from app.api.role import views as r_view
from app.api.account import views as a_view
from app.api.margin import views as m_view
from app.api.export import views as e_view
api_router = APIRouter()
api_router.include_router(u_view.router, prefix="/users", tags=["users"])
......@@ -11,3 +12,4 @@ api_router.include_router(s_view.router, prefix="/statement", tags=["statement"]
api_router.include_router(r_view.router, prefix="/role", tags=["role"])
api_router.include_router(a_view.router, prefix="/account", tags=["account"])
api_router.include_router(m_view.router, prefix="/margin", tags=["margin"])
api_router.include_router(e_view.router, prefix="/export", tags=["export"])
from sqlalchemy.orm import Session
from app.api.export import schemas
from libs.functions import get_now_datetime
from libs.orm import QueryAllData
from models.export import ExportFile
def get_export_list(db: Session, param):
"""导出列表"""
export_filters = []
if param.get("source"):
export_filters.append(ExportFile.source == param.get("source"))
if param.get("start_time"):
export_filters.append(ExportFile.create_time >= param.get("start_time"))
if param.get("end_time"):
export_filters.append(ExportFile.create_time >= param.get("end_time"))
querydata, count = QueryAllData(db, ExportFile, param, export_filters).query_data()
data = [QueryAllData.serialization(item) for item in querydata]
return data, count
def update_export(db: Session, data):
try:
db.query(ExportFile).filter(ExportFile.id == data.id).update({ExportFile.remark: data.remark})
db.commit()
except Exception as e:
print(e)
return False
return True
def delete_export(db: Session, export_id):
"""删除导出记录"""
try:
db.query(ExportFile).filter(ExportFile.id == export_id).delete()
db.commit()
except Exception as e:
print(e)
return False
return True
def create_export_data(db: Session, export, operator):
"""创建导出记录"""
try:
db_export = ExportFile(operator=operator.get("username"), source=export.get("source"), method=export.get("method"),
create_time=get_now_datetime(), update_time=get_now_datetime(), status=export.get("status"))
db.add(db_export)
db.commit()
db.refresh(db_export)
except Exception as e:
print(e)
return {}
return db_export
def get_source_data(db):
res = db.query(ExportFile.source).filter().group_by('source').all()
return [i[0] for i in res]
from typing import Optional
from pydantic import BaseModel
class ExportList(BaseModel):
source: Optional[str] = ""
start_time: Optional[str] = ""
end_time: Optional[str] = ""
page: Optional[int] = None
size: Optional[int] = None
class ExportUpdateData(BaseModel):
id: int
remark: str = ""
from fastapi import Depends, APIRouter
from sqlalchemy.orm import Session
from app import get_db
from app.api.export import schemas, crud
from libs.result_format import HttpResultResponse, HttpMessage
router = APIRouter()
@router.post("/list")
def export_list(data: schemas.ExportList, db: Session = Depends(get_db)):
"""导出记录列表"""
result, total = crud.get_export_list(db, data.dict(exclude_none=True))
return HttpResultResponse(total=total, data=result)
@router.post("/update")
def update_export_list(data: schemas.ExportUpdateData, db: Session = Depends(get_db)):
"""导出记录修改"""
result = crud.update_export(db, data)
if result:
return HttpResultResponse()
return HttpResultResponse(code=422, msg=HttpMessage.LOSE)
@router.delete("/delete/{id}")
def delete_export_one(id:int, db: Session = Depends(get_db)):
"""导出记录删除"""
is_delete = crud.delete_export(db, id)
if is_delete:
return HttpResultResponse()
return HttpResultResponse(code=422, msg=HttpMessage.DELETE_LOSE)
@router.get("/source")
def export_source_query(db: Session = Depends(get_db)):
"""导出来源查询"""
result = crud.get_source_data(db)
return HttpResultResponse(data=result)
import math
import threading
import pandas as pd
from sqlalchemy import and_, or_, func
from core.config.env import env
from libs.db_link import LinkMysql
from sqlalchemy import and_, func
from app.api.statement.guild import query_token
from starlette.responses import StreamingResponse
from sqlalchemy.orm import Session
from libs.functions import wrapper_out
from app.api.export import crud
from libs.orm import QueryAllData
from models.recharge import Recharge, UserWC, GuildWC, FinanceFixLog
......@@ -16,12 +13,24 @@ locka = threading.Lock()
# 写入文件
def data_to_file(data, name):
bk = pd.DataFrame(data)
with pd.ExcelWriter(f'static/{name}.xlsx') as writer:
bk.to_excel(writer, sheet_name='Sheet1', index=False)
file = open(writer, 'rb')
return StreamingResponse(file, media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
def data_to_file(db, data, name, header):
# 获取操作人
user = query_token(db, header)
params = {"source": name, "method": "data_to_file", "status": 1}
if len(data) == 0:
params["status"] = 3
try:
bk = pd.DataFrame(data)
with pd.ExcelWriter(f'static/{name}.xlsx') as writer:
bk.to_excel(writer, sheet_name='Sheet1', index=False)
file = open(writer, 'rb')
# 记录导出
crud.create_export_data(db, params, user)
return StreamingResponse(file, media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
except Exception as e:
print(e)
params["status"] = 2
crud.create_export_data(db, params, user)
class RechargeStatement(object):
......
......@@ -23,10 +23,11 @@ def statement_recharge_list(data: schemas.StatementList, db: Session = Depends(g
@router.post("/derive/excel")
def statement_derive_excel(data: schemas.StatementList, db: Session = Depends(get_db)):
def statement_derive_excel(data: schemas.StatementList, request: Request, db: Session = Depends(get_db)):
"""充值报表导出"""
header_list = request.get("headers")
statement_list = RechargeStatement().get_statements(db, data)
return crud.data_to_file(statement_list, "充值报表")
return crud.data_to_file(db, statement_list, "充值报表", header_list)
@router.post("/userWithdrawal/list")
......@@ -61,14 +62,14 @@ def guild_payment_list(data:PaymentWithdrawalList,db: Session = Depends(get_db))
async def uploadFile(a_file: bytes = File(...)):
a_content = a_file
image_name = random_number()
cos_path = new_upload_file(a_content,image_name)
cos_path = new_upload_file(a_content, image_name)
return HttpResultResponse(data=cos_path)
@router.post("/payment/add")
def guild_payment_list(data:PaymentAdd,db: Session = Depends(get_db)):
"""提交打款"""
dataPayment = Paymentlog(uuid=data.uuid,money=data.money,cont=data.cont,url=data.url,create_time=datetime.now())
dataPayment = Paymentlog(uuid=data.uuid, money=data.money, cont=data.cont,url=data.url,create_time=datetime.now())
db.add(dataPayment)
db.commit()
db.refresh(dataPayment)
......
......@@ -15,6 +15,9 @@ class HttpMessage(object):
ACCOUNT_EXIST = "账号已存在"
DELETE_LOSE = '删除失败'
LOSE = '操作失败'
class DecimalEncoder(json.JSONEncoder):
def default(self, res):
......
from core.storage.db import engine
from models import users, roles, recharge, account, margin, guild
from models import users, roles, recharge, account, margin, guild, export
# 映射模型表
users.Base.metadata.create_all(bind=engine)
......@@ -8,3 +8,4 @@ recharge.Base.metadata.create_all(bind=engine)
account.Base.metadata.create_all(bind=engine)
margin.Base.metadata.create_all(bind=engine)
guild.Base.metadata.create_all(bind=engine)
export.Base.metadata.create_all(bind=engine)
from sqlalchemy import Column, Integer, String, Text, DateTime, Float
from core.storage.db import Base
from sqlalchemy_serializer import SerializerMixin
class ExportFile(Base, SerializerMixin):
"""账户表"""
__tablename__ = "export_record"
id = Column(Integer, primary_key=True, index=True)
operator = Column(String(10), comment="操作人")
source = Column(String(50), comment="请求来源标识,方便扩展,比如财务后台、总后台、公会后台等")
method = Column(String(50), comment="哪个方法进行的导出")
params = Column(Text, comment="json格式的请求参数")
identify = Column(String(32), comment="md5的params值,用于和method一起做查询")
status = Column(Integer, default=0, comment="执行状态 0:待执行 1:成功 2:失败,3:无数据导出")
remark = Column(Text, comment="备注")
url = Column(String(200), comment="文件地址")
create_time = Column(DateTime, comment="创建时间")
update_time = Column(DateTime, comment="更新时间")
__table_args__ = {'comment': '导出文件记录'}
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