Commit 7e590df3 authored by xianyang's avatar xianyang

账户列表优化,月度统计导出接口

parent 48ad50d8
from datetime import datetime
import pandas as pd
from sqlalchemy import and_
from sqlalchemy import and_, func
from sqlalchemy.orm import Session
from app.api.account import schemas
from libs.functions import wrapper_out
......@@ -24,10 +24,12 @@ def get_account_list(db: Session, param):
result_list = []
if param.name:
query_res = db.query(models.Account).filter(models.Account.name.like(f'%{param.name}%')).\
count = db.query(func.count(models.Account.id)).filter(models.Account.name.like(f'%{param.name}%')).scalar()
query_res = db.query(models.Account).filter(models.Account.name.like(f'%{param.name}%')).order_by(models.Account.id.desc()).\
offset((int(param.page) - 1) * param.size).limit(param.page * param.size).all()
else:
query_res = db.query(models.Account).offset((int(param.page) - 1) * param.size).limit(param.page * param.size).all()
count = db.query(func.count(models.Account.id)).scalar()
query_res = db.query(models.Account).order_by(models.Account.id.desc()).offset((int(param.page) - 1) * param.size).limit(param.page * param.size).all()
if not query_res:
return []
for i in query_res:
......@@ -43,7 +45,7 @@ def get_account_list(db: Session, param):
else:
serializer_info['output'] = []
result_list.append(serializer_info)
return result_list
return result_list, count
def get_gift_type(db: Session):
......@@ -132,6 +134,8 @@ def get_finance_details(db, data, is_list=None):
return [], 0, 0 if is_list else []
# 判断是列表还是导出接口
if is_list:
if not serial_info:
return [], 0, 0
df = pd.DataFrame(serial_info)
count = df['amount'].apply(lambda x: x).sum()
return serial_info[(int(data.page) - 1) * data.size:data.size * data.page], len(serial_info), count
......
......@@ -23,8 +23,8 @@ def create_account(data: schemas.AccountCreate, db: Session = Depends(get_db)):
@router.post("/list")
def user_list(data: schemas.AccountList, db: Session = Depends(get_db)):
"""账户列表"""
result = crud.get_account_list(db, data)
return HttpResultResponse(total=len(result), data=result)
result, num = crud.get_account_list(db, data)
return HttpResultResponse(total=num, data=result)
@router.get("/gift/type")
......
......@@ -72,22 +72,18 @@ class CalculationMonthlyBill(object):
self.structure_list = []
self.structure_key = []
@staticmethod
def data_to_table(data):
"""数据导出"""
bk = pd.DataFrame(data)
with pd.ExcelWriter(f'static/业务类型月度汇总报表.xlsx') as writer:
bk.to_excel(writer, sheet_name='业务类型月度汇总', index=False)
file = open(writer, 'rb')
return StreamingResponse(file, media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
def month_statistics_task(self, date, page, size):
def month_statistics_task(self, date, key_type, page, size):
"""主函数"""
db = env.MysqlDB
db["database"] = env.DB_HISTORY
sql = f"SELECT reference_type, type, SUM(cast(amount as decimal(20,6)))/1000 as money FROM {date} GROUP BY reference_type, type ORDER BY reference_type"
res_data = LinkMysql(db).query_mysql(sql)
if key_type:
sql = f"SELECT reference_type, type, SUM(cast(amount as decimal(20,6)))/1000 as money FROM {date} where reference_type='{key_type}' GROUP BY reference_type, type ORDER BY reference_type"
else:
sql = f"SELECT reference_type, type, SUM(cast(amount as decimal(20,6)))/1000 as money FROM {date} GROUP BY reference_type, type ORDER BY reference_type"
try:
res_data = LinkMysql(db).query_mysql(sql)
except Exception as e:
return [], 0
for res in res_data:
if res["reference_type"] in self.structure_key:
continue
......@@ -114,7 +110,7 @@ class CalculationMonthlyBill(object):
class CalculationMonthlyDetails(object):
"""月度详情"""
@staticmethod
def data_query(db, date, reference_type, is_out, page, size):
sql = f"SELECT reference_type,order_number,type,cast(amount as decimal(20,6))/1000 as money,amount_type,create_time FROM {date} where reference_type='{reference_type}' and type={is_out} LIMIT {(page-1)*size},{size}"
......@@ -137,3 +133,54 @@ class CalculationMonthlyDetails(object):
data = future1.result()
num = future2.result()
return data, num
class MonthDataDerive(object):
"""月度导出"""
def __init__(self):
self.derive_key = []
self.derive_list = []
@staticmethod
def data_to_table(data):
"""数据导出"""
bk = pd.DataFrame(data)
with pd.ExcelWriter(f'static/业务类型月度汇总报表.xlsx') as writer:
bk.to_excel(writer, sheet_name='业务类型月度汇总', index=False)
file = open(writer, 'rb')
return StreamingResponse(file, media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
def derive_data(self, date, key_type):
db = env.MysqlDB
db["database"] = env.DB_HISTORY
if key_type:
sql = f"SELECT reference_type, type, SUM(cast(amount as decimal(20,6)))/1000 as money FROM {date} where reference_type='{key_type}' GROUP BY reference_type, type ORDER BY reference_type"
else:
sql = f"SELECT reference_type, type, SUM(cast(amount as decimal(20,6)))/1000 as money FROM {date} GROUP BY reference_type, type ORDER BY reference_type"
try:
res_data = LinkMysql(db).query_mysql(sql)
except Exception as e:
return [], 0
for res in res_data:
if res["reference_type"] in self.derive_key:
continue
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]
income = [i['money'] for i in res_data if i['reference_type'] == res["reference_type"] and i['type'] == 1]
out_value = float(out[0]) if out else 0
income_value = float(income[0]) if income else 0
a = {
"name": name,
"type": res["reference_type"],
"expenditure": out_value,
"income": income_value,
"is_error": 0 if out_value == income_value else 1,
"error_money": float('%.2f' % (out_value - income_value))
}
self.derive_key.append(res["reference_type"])
self.derive_list.append(a)
return self.data_to_table(self.derive_list)
......@@ -18,8 +18,9 @@ class ExportUpdateData(BaseModel):
class MonthStatistics(BaseModel):
date: str = ""
page: int
size: int
type: str = ""
page: int = None
size: int = None
class MonthDetails(MonthStatistics):
......
......@@ -47,7 +47,8 @@ def month_query_total_export(param: schemas.MonthStatistics):
if not param.date:
month_date = datetime.now().date() - relativedelta(months=1)
param.date = month_date.strftime("%Y%m")
result, num = crud.CalculationMonthlyBill().month_statistics_task('assets_log_' + param.date, param.page, param.size)
result, num = crud.CalculationMonthlyBill().month_statistics_task('assets_log_' + param.date, param.type,
param.page, param.size)
return HttpResultResponse(total=num, data=result)
......@@ -58,3 +59,12 @@ def month_query_total_export(param: schemas.MonthDetails):
return HttpResultResponse(msg='查询月份不能为空')
result, num = crud.CalculationMonthlyDetails().statement_income_expenditure(param)
return HttpResultResponse(total=num, data=result)
@router.post("/month")
def month_to_export(param: schemas.MonthStatistics):
"""月度表导出"""
if not param.date:
return HttpResultResponse(msg='查询月份不能为空')
result = crud.MonthDataDerive().derive_data('assets_log_' + param.date, param.type)
return result
......@@ -6,10 +6,11 @@ from sqlalchemy.orm import Session
from libs.functions import get_now_timestamp, get_now_datetime
from libs.orm import QueryAllData
from libs.token_verify import get_current_user
from models.recharge import Settlement, Fitransferlog, FinanceFixLog, Fiaccount, Account_log
from models.users import V2User
from models.recharge import Settlement, Fitransferlog, FinanceFixLog, Account_log
from models.guild import Guild
from models.account import Account
from models.users import V2User
from models.guild import Guild
locka = threading.Lock()
......@@ -138,16 +139,16 @@ def query_uuid_or_user_number(db: Session, param):
guild = db.query(Guild).filter(Guild.uuid == param.uuid).first()
if not guild:
return {}
return {"nick_name": "(公会)" + guild.guild_name, "user_number": guild.id, "is_guild": 1}
return {"nick_name": user.nick_name, "user_number": user.user_id, "is_guild": 0}
return {"nick_name": "(公会)" + guild.guild_name, "uuid": guild.uuid, "is_guild": 1, "id": guild.id}
return {"nick_name": user.nick_name, "uuid": user.uuid, "is_guild": 0, "id": user.user_id}
if param.user_number:
user = db.query(V2User).filter(V2User.user_number == param.user_number).first()
return {"nick_name": user.nick_name, "user_id": user.user_id, "uuid": user.uuid}
account = db.query(Account).filter(Account.uuid == param.user_number).first()
return {"nick_name": account.name, "user_id": account.unique_tag, "uuid": account.uuid, "id": account.id}
def account_money(db: Session, param):
"""查询账户余额"""
account = db.query(Account).filter(Account.id == param.id).first()
account = db.query(Account).filter(Account.uuid == param.id).first()
if not account:
return 0
return account.consumable if account.consumable else 0
......@@ -170,11 +171,33 @@ def query_token(db, h_list):
def transfer_money(db: Session, param, h_list):
"""转账"""
user = query_token(db, h_list)
if param.type == 0:
out = db.query(Account).filter(Account.uuid == param.dst_id).first()
income = db.query(Account).filter(Account.uuid == param.transfer_id).first()
dst_name = out.name
transfer_name = income.name
if param.type == 1:
out = db.query(Account).filter(Account.uuid == param.dst_id).first()
income = db.query(V2User).filter(V2User.uuid == param.transfer_id).first()
transfer_name = income.nick_name if income else ""
if not income:
income = db.query(Guild).filter(Guild.uuid == param.transfer_id).first()
transfer_name = income.guild_name if income else ""
dst_name = out.name if income else ""
if param.type == 2:
out = db.query(V2User).filter(V2User.uuid == param.dst_id).first()
dst_name = out.nick_name if out else ""
if not out:
out = db.query(Guild).filter(Guild.uuid == param.dst_id).first()
dst_name = out.guild_name if out else ""
income = db.query(Account).filter(Account.uuid == param.transfer_id).first()
transfer_name = income.name if income else ""
try:
present = Fitransferlog(dst_id=param.dst_id, amount=param.amount, type=param.type,
present = Fitransferlog(dst_id=param.dst_id, dst_name=dst_name, amount=param.amount, type=param.type,
transfer_id=param.transfer_id, nick_name=param.nick_name, remark=param.remark,
operator=user.get("username"), transfer_type=param.transfer_type,
create_time=get_now_timestamp())
create_time=get_now_datetime(), transfer_name=transfer_name)
db.add(present)
db.commit()
db.refresh(present)
......@@ -200,7 +223,6 @@ def create_fix_table(db: Session, param, h_list):
return present
def recovery_fix_data(db: Session, dbname, params):
recovery_list = []
if params.get("uuid"):
......@@ -211,20 +233,18 @@ def recovery_fix_data(db: Session, dbname, params):
recovery_list.append(dbname.create_time <= params.get("end_time"))
querydata, count = QueryAllData(db, dbname, params, recovery_list).query_data()
data = [QueryAllData.serialization(item) for item in querydata]
for item in data:
for item in data:
accout_filters = []
accout_filters.append(dbname.uuid == item.get("uuid"))
names=QueryAllData(db, Fiaccount,{},accout_filters).query_filter()
names = QueryAllData(db, Account, {}, accout_filters).query_filter()
if names:
item['name']=names.name
item['uuid']=names.uuid
item['name'] = names.name
item['uuid'] = names.uuid
else:
item['name']=''
item['name'] = ''
return data, count
def create_recovery_table(db: Session, param):
"""增加修复报表"""
try:
......
......@@ -108,9 +108,11 @@ class UserNumber(BaseModel):
class CreateBill(BaseModel):
dst_id: int
dst_id: str
dst_name: str = ""
amount: float
transfer_id: int
transfer_id: str
transfer_name: str = ""
remark: str
type: int
nick_name: Optional[str] = ""
......
......@@ -11,7 +11,8 @@ from app.api.statement.guild import GuildSet, paymentset_guild_data, outon_accou
from app.api.statement.schemas import PaymentWithdrawalList, PaymentAdd, PaymentAccountlList, UserNumber, CreateBill
from libs.img_code import new_upload_file, random_number
from libs.result_format import HttpResultResponse
from models.recharge import Paymentlog, Fiaccount, Fitransferlog, Account_log
from models.recharge import Paymentlog, Fitransferlog, Account_log
from models.account import Account
router = APIRouter()
......@@ -64,11 +65,13 @@ async def uploadFile(a_file: bytes = File(...)):
a_content = a_file
image_name = random_number()
cos_path = new_upload_file(a_content, image_name)
if not cos_path:
return HttpResultResponse(code=500, msg="上传失败,请检查cos是否正常")
return HttpResultResponse(data=cos_path)
@router.post("/payment/add")
def guild_payment_list(data:PaymentAdd,db: Session = Depends(get_db)):
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())
db.add(dataPayment)
......@@ -81,7 +84,7 @@ def guild_payment_list(data:PaymentAdd,db: Session = Depends(get_db)):
@router.get("/onaccount")
def outon_account(db: Session = Depends(get_db)):
"""转出和转入账户人员列表"""
account_list, total = outon_account_data(db, Fiaccount,{})
account_list, total = outon_account_data(db, Account, {})
return HttpResultResponse(total=total, data=account_list)
......@@ -111,6 +114,8 @@ def account_transfer_money(data: CreateBill, request: Request, db: Session = Dep
"""账户转账"""
header_list = request.get("headers")
res_info = transfer_money(db, data, header_list)
if not res_info:
return HttpResultResponse(code=500, msg='创建失败')
return HttpResultResponse(data=res_info.id)
......@@ -136,17 +141,15 @@ def finance_fix(data: acc_schemas.FixTable, request: Request, db: Session = Depe
return HttpResultResponse(data=res.id)
@router.post("/data/recovery")
def recovery_fix(data: acc_schemas.Recovery_fix, db: Session = Depends(get_db)):
"""异常数据修复"""
recovery_list, total = guild.recovery_fix_data(db, Account_log,data.dict(exclude_none=True))
recovery_list, total = guild.recovery_fix_data(db, Account_log, data.dict(exclude_none=True))
return HttpResultResponse(total=total, data=recovery_list)
@router.post("/submit/recovery")
def finance_fix(data: acc_schemas.RecoveryTable,db: Session = Depends(get_db)):
def finance_fix(data: acc_schemas.RecoveryTable, db: Session = Depends(get_db)):
"""新增异常数据修复"""
res = guild.create_recovery_table(db, data)
return HttpResultResponse(data=res.id)
......@@ -155,5 +158,5 @@ def finance_fix(data: acc_schemas.RecoveryTable,db: Session = Depends(get_db)):
@router.post("/recovery/fix")
def recovery_fix(data: acc_schemas.RecoveryupdateTable, db: Session = Depends(get_db)):
"""异常数据修复"""
res = guild.update_recovery_table(db,data.dict(exclude_none=True))
return HttpResultResponse(data=res.get("id"))
\ No newline at end of file
res = guild.update_recovery_table(db, data.dict(exclude_none=True))
return HttpResultResponse(data=res.get("id"))
......@@ -110,4 +110,5 @@ TYPE_NAME = {
"seven_country_award": "2022_七国游记活动-榜单奖励领取",
"time_detective_award": "时空侦探活动-榜单领奖",
"translate": "翻译付费",
"userWithdrawal_dec": "用户提现扣除项",
}
......@@ -65,22 +65,24 @@ class imageCode():
return img.decode('utf-8')
def new_upload_file(file_object,filename):
'''图片上传cos'''
filename=COS_RERURN_PATH+filename+'.png'
response = client.put_object(
Bucket=Bucket,
Body=file_object,
Key=filename,
)
filename = COS_RERURN_PATH+filename+'.png'
try:
response = client.put_object(
Bucket=Bucket,
Body=file_object,
Key=filename,
)
except Exception as e:
print("上传失败")
return ""
if response is None:
print("上传成功")
cos_path =COS_PATH + filename
cos_path = COS_PATH + filename
return cos_path
def random_number():
randomId = ''.join([str(random.randint(1, 999999)).zfill(3) for _ in range(2)])
return randomId
\ No newline at end of file
......@@ -97,25 +97,6 @@ class Paymentlog(Base, SerializerMixin):
__table_args__ = {'comment': '打款记录表'}
class Fiaccount(Base, SerializerMixin):
'''
账户
'''
__tablename__ = "fi_account"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(100), comment="账户名称")
unique_tag = Column(String(100), comment="唯一标记")
beneficiary = Column(String(100), comment="受益人")
description = Column(String(100), comment="描述信息")
uuid = Column(String(60), comment="用户id", index=True)
create_time = Column(DateTime, comment="创建时间")
config_key = Column(String(150), comment="配置key,和api接口约定好的标识")
income = Column(Text, comment="入账")
output = Column(Text, comment="出账")
operator = Column(String(255), comment="")
operator_id = Column(Integer, comment="操作id")
class Fitransferlog(Base, SerializerMixin):
'''
转账列表, 商量说存id
......@@ -123,9 +104,11 @@ class Fitransferlog(Base, SerializerMixin):
__tablename__ = "fi_transfer_log"
id = Column(Integer, primary_key=True, index=True)
amount = Column(DECIMAL(20, 6), comment="转入金额")
dst_id = Column(Integer, comment="转出账户id")
dst_id = Column(String(100), comment="转出账户id")
dst_name = Column(String(100), comment="转出账户名称")
create_time = Column(Integer, comment="创建时间")
transfer_id = Column(Integer, comment="转入账户id")
transfer_id = Column(String(100), comment="转入账户id")
transfer_name = Column(String(100), comment="转入账户名称")
type = Column(Integer, comment="转账类型(0:对企业,1:对个人)")
nick_name = Column(String(100), comment="用户昵称")
remark = Column(String(255), 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