Commit 05483a29 authored by xianyang's avatar xianyang

Merge branch 'development' of http://gitlab.3yakj.com/xianyang/financial_system into develop/xp

 Conflicts:
	core/config/env.py
	libs/functions.py
parents 75f59aba 823c2f32
......@@ -6,7 +6,7 @@
<excludeFolder url="file://$MODULE_DIR$/fs-env" />
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.8 (financial_system)" jdkType="Python SDK" />
<orderEntry type="jdk" jdkName="Python 3.8 (financial-system)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
......
......@@ -42,10 +42,19 @@ def data_to_file(db, data, name, header):
class RechargeStatement(object):
"""充值报表"""
def __init__(self):
self.linkmysql=LinkMysql(env.DB_3YV2)
self.linkmysql = LinkMysql(env.DB_3YV2)
self.derive_list = []
def query_data(self, page, size):
count_sql = f'SELECT count(*) FROM `orders` as d inner join v2_user as u on d.userid=u.user_id where status=1'
count = self.linkmysql.query_mysql(count_sql)[0].get("count(*)")
sql = f'SELECT d.id as order_number,d.userid as user_id,u.user_number,u.nick_name,d.money,d.paychannel as pay_channel,d.sid,d.current,FROM_UNIXTIME(d.payment_time,"%Y-%c-%d %h:%i:%s") as payment_time,FROM_UNIXTIME(d.lastupdate,"%Y-%c-%d %h:%i:%s") as last_update FROM `orders` as d inner join v2_user as u on d.userid=u.user_id where status=1 ORDER BY id desc limit {page},{(size)}'
once_res = self.linkmysql.query_mysql(sql)
money_sql = f'SELECT sum(d.balanceadd) FROM `orders` as d inner join v2_user as u on d.userid=u.user_id where status=1'
moeny_data = self.linkmysql.query_mysql(money_sql)[0].get("sum(d.balanceadd)")
return count, once_res, moeny_data
def query_data(self,page,size,order_number,user_id,sid,start_time,end_time):
query=[]
if start_time:
......@@ -154,6 +163,7 @@ class RechargeStatement(object):
class WithdrawStatement(object):
"""提现报表"""
def __init__(self):
self.derive_user_list = []
self.linkmysql=LinkMysql(env.DB_3YV2)
......@@ -334,7 +344,6 @@ class WithdrawStatement(object):
return statement_list, count, moeny_data, final_money
class FinanceFix(object):
@staticmethod
......@@ -349,7 +358,7 @@ class FinanceFix(object):
count_sql = f"select count(id) as num from finance_fix_log where {' and '.join(finance_filters)}"
data_sql = f"select id,type,money,unique_tag,amount_type,operator,create_time,remark from finance_fix_log where {' and '.join(finance_filters)} order by id DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select count(id) as num from finance_fix_log where {' and '.join(finance_filters)}"
count_sql = f"select count(id) as num from finance_fix_log"
data_sql = f"select id,type,money,unique_tag,amount_type,operator,create_time,remark from finance_fix_log order by id DESC limit {(int(page) - 1) * size},{size}"
with ThreadPoolExecutor(max_workers=2) as pool:
future1 = pool.submit(LinkMysql(env.DB_3YV2).query_mysql, count_sql)
......
import json
import math
import socket
import threading
......@@ -141,43 +142,66 @@ def outon_account_data(db: Session, dbname, params):
return data, count
def accout_list_data(db: Session, dbname, params):
def accout_list_data(**params):
accout_filters = []
if params.get("transfer_name"):
accout_filters.append(dbname.transfer_name.like(f'%{params.get("transfer_name")}%'))
accout_filters.append(f" transfer_name like '%{params.get('transfer_name')}%'")
if params.get("dst_name"):
accout_filters.append(dbname.dst_name.like(f'%{params.get("dst_name")}%'))
accout_filters.append(f" dst_name like '%{params.get('dst_name')}%'")
if params.get("start_time"):
accout_filters.append(dbname.create_time >= params.get("start_time") + " 00:00:00")
accout_filters.append(f" create_time >= {time_str_to_timestamp(params.get('start_time') + ' 00:00:00')} ")
if params.get("end_time"):
accout_filters.append(dbname.create_time <= params.get("end_time") + " 23:59:59")
querydata, count = QueryAllData(db, dbname, params, accout_filters).query_data()
data = [QueryAllData.serialization(item) for item in querydata]
return data, count
accout_filters.append(f" create_time <= {time_str_to_timestamp(params.get('end_time') + ' 23:59:59')} ")
if accout_filters:
count_sql = f"select count(id) as num from fi_transfer_log where {' and '.join(accout_filters)}"
data_sql = f"select id,amount,dst_name,create_time,dst_uuid,transfer_uuid,remarks,operator from fi_transfer_log where {' and '.join(accout_filters)} order by id DESC limit {(int(params.get('page')) - 1) * params.get('size')},{params.get('size')}"
else:
count_sql = f"select count(id) as num from fi_transfer_log"
data_sql = f"select * from fi_transfer_log order by id DESC limit {(int(params.get('page')) - 1) * params.get('size')},{params.get('size')}"
with ThreadPoolExecutor(max_workers=2) as pool:
future1 = pool.submit(LinkMysql(env.DB_3YV2).query_mysql, count_sql)
future2 = pool.submit(LinkMysql(env.DB_3YV2).query_mysql, data_sql)
total = future1.result()
res = future2.result()
if res:
return res, total[0]['num']
return [], 0
def query_uuid_or_user_number(db: Session, param):
def query_uuid_or_user_number(param):
"""查询uuid和user_number"""
if param.uuid:
user = db.query(V2User).filter(V2User.uuid == param.uuid).first()
user_sql = f"select nick_name,uuid from v2_user where uuid='{param.uuid}' limit 0,1"
user = LinkMysql(env.DB_3YV2).query_mysql(user_sql)
if not user:
guild = db.query(Guild).filter(Guild.uuid == param.uuid).first()
guild_sql = f"select id,guild_name,uuid from guild where uuid='{param.uuid}' limit 0,1"
guild = LinkMysql(env.DB_3YV2).query_mysql(guild_sql)
if not guild:
return {}
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}
return {"nick_name": "(公会)" + guild[0]['guild_name'], "uuid": guild[0]['uuid'], "is_guild": 1,
"id": guild[0]['id']}
return {"nick_name": user[0]['nick_name'], "uuid": user[0]['uuid'], "is_guild": 0, "id": user[0]['user_id']}
if param.user_number:
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}
account_sql = f"select id,name,uuid,unique_tag from fi_account where uuid='{param.uuid}' limit 0,1"
account = LinkMysql(env.DB_3YV2).query_mysql(account_sql)
if account:
return {"nick_name": account[0]['name'], "user_id": account[0]['unique_tag'], "uuid": account[0]['uuid'],
"id": account[0]['id']}
return {}
def account_money(db: Session, param):
def account_money(uuid):
"""查询账户余额"""
account = db.query(Account).filter(Account.uuid == param.id).first()
if not account:
return 0
return account.consumable if account.consumable else 0
platform_data = search({"uuid": uuid}, 'Server.UserQuery.GetUserAsset')
if platform_data['status']:
try:
platform_money = platform_data['data']['result']['data']['asset_balance']['consumable']['current_amount']
except Exception as e:
print(f"清算系统异常:{e}")
platform_money = 0
return platform_money
return 0
def query_token(db, h_list):
......@@ -194,58 +218,69 @@ def query_token(db, h_list):
return user_info
def transfer_trigger_task(db, data):
def transfer_trigger_task(uuid, user_id, balance, type, amount_type=1, remark='用户转账', money_data=[],
isUser=1, dst_uuid=False, referNum=''):
"""转账验证"""
try:
dst = db.query(Account).filter(Account.uuid == data.dst_id).first() # 转出
transfer = db.query(Account).filter(Account.uuid == data.transfer_id).first() # 转入
if float(dst.consumable) < data.amount:
return "账户余额不足"
dst.consumable = float(dst.consumable) - data.amount
transfer.consumable = float(transfer.consumable) + data.amount
db.commit()
except Exception as e:
db.rollback()
return "操作失败"
return ""
request_data = {
"ip": get_ip(),
"uuid": uuid,
"dst_uuid": dst_uuid,
"reference_number": get_order(),
"reference_type": type,
"amount": balance,
"timestamp": get_now_timestamp(),
"amount_type": 'consumable' if amount_type ==1 else 'withdrawable',
"notify_url": ""
}
res = search(request_data, 'Server.UserExecute.Transfer')
print(res)
status = 2
if res['status'] == 0:
errmsg = json.dumps(res['data'])
status = 3
add_sql = f"insert into all_record_table(user_id, type, status, reference_number, remark, money, is_add, money_data,create_time) " \
f"values({user_id}, '{type}', {status},'{get_order()}','{remark}', {balance * 10 if amount_type == 1 else balance * 100},1,'{json.dumps(money_data)}',{get_now_timestamp()});"
LinkMysql(env.DB_3YV2).perform_mysql(add_sql)
return res
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 ""
# 转账
is_success = transfer_trigger_task(db, param)
if is_success:
return is_success
user_id = 0
if param.type == 0: # 系统转系统
out_sql = f"select name from fi_account where uuid='{param.dst_id}' limit 0,1"
out = LinkMysql(env.DB_3YV2).query_mysql(out_sql)
dst_name = out[0]['name']
if param.type == 1: # 系统转个人/公会
out_sql = f"select name from fi_account where uuid='{param.dst_id}' limit 0,1"
out = LinkMysql(env.DB_3YV2).query_mysql(out_sql)
income_sql = f"select user_id,nick_name from v2_user where uuid='{param.transfer_id}' limit 0,1"
income = LinkMysql(env.DB_3YV2).query_mysql(income_sql)
# income存在用户存在,就不查公会
if income:
user_id = income[0]['user_id']
dst_name = out[0]['name']
if param.type == 2: # 个人/公会转系统
out_sql = f"select nick_name from v2_user where uuid='{param.transfer_id}' limit 0,1"
out = LinkMysql(env.DB_3YV2).query_mysql(out_sql)
if out:
dst_name = out[0]['nick_name']
else:
out_guild_sql = f"select guild_name from guild where uuid='{param.transfer_id}'"
out_guild = LinkMysql(env.DB_3YV2).query_mysql(out_guild_sql)
dst_name = out_guild[0]['guild_name'] if out_guild else ""
try:
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_datetime(), transfer_name=transfer_name)
db.add(present)
db.commit()
db.refresh(present)
# 转账
is_success = transfer_trigger_task(param.dst_id, 0, param.amount, 'platformRecharge', 1,
f"{param.dst_id}给{param.transfer_id}转账", [], 0, param.transfer_id)
if not is_success['status']:
return is_success
user = query_token(db, h_list)
transfer_sql = f"insert into fi_transfer_log(amount, dst_name, create_time, transfer_uuid, dst_uuid, user_id, remarks, operator,operator_id) " \
f"values({param.amount}, '{dst_name}', {get_now_timestamp()},'{param.transfer_id}','{param.dst_id}', {user_id if user_id else 0},'{param.remark}','{user.get('username')}',{user.get('user_id')});"
LinkMysql(env.DB_3YV2).perform_mysql(transfer_sql)
except Exception as e:
return e
return {}
......
......@@ -109,14 +109,12 @@ class UserNumber(BaseModel):
class CreateBill(BaseModel):
dst_id: Optional[str] = ""
dst_name: str = ""
amount: float
dst_name: Optional[str] = ""
amount: Optional[float] = 0.0
transfer_id: Optional[str] = ""
transfer_name: str = ""
remark: Optional[str] = ""
type: int
nick_name: Optional[str] = ""
transfer_type: Optional[str] = ""
type: Optional[int] = None
# @validator('transfer_id')
# def transfer_id_must_contain_space(cls, v):
......
......@@ -64,7 +64,7 @@ def guild_payment_list(page: Optional[int] = 1, size: Optional[int] = 10,start_t
@router.post('/upload')
async def uploadFile(a_file: bytes = File(...),token=Depends(login_required),):
async def uploadFile(a_file: bytes = File(...), token=Depends(login_required), ):
a_content = a_file
image_name = random_number()
cos_path = new_upload_file(a_content, image_name)
......@@ -74,37 +74,46 @@ async def uploadFile(a_file: bytes = File(...),token=Depends(login_required),):
@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)):
"""提交打款"""
transfer_query(data)
return HttpResultResponse(code=200,data='')
@router.get("/onaccount")
def outon_account(db: Session = Depends(get_db),token=Depends(login_required)):
def outon_account(db: Session = Depends(get_db), token=Depends(login_required)):
"""转出和转入账户人员列表"""
account_list, total = outon_account_data(db, Account, {})
return HttpResultResponse(total=total, data=account_list)
@router.post("/transferlist")
def outon_account(data: PaymentAccountlList,token=Depends(login_required),db: Session = Depends(get_db)):
@router.get("/transferlist")
def out_on_account(page: int,
size: int,
start_time: Optional[str] = "",
end_time: Optional[str] = "",
transfer_name: Optional[str] = "",
dst_name: Optional[str] = "",
token=Depends(login_required)):
"""转账列表"""
account_list, total = accout_list_data(db, Fitransferlog, data.dict(exclude_none=True))
account_list, total = accout_list_data(page=page, size=size, start_time=start_time, end_time=end_time,
transfer_name=transfer_name, dst_name=dst_name)
return HttpResultResponse(total=total, data=account_list)
@router.post("/query/consumable")
def query_account_money(data: UserNumber,token=Depends(login_required),db: Session = Depends(get_db)):
@router.get("/query/consumable")
def query_account_money(uuid: str, token=Depends(login_required)):
"""查询账户余额"""
consumable = account_money(db, data)
return HttpResultResponse(data=int(consumable))
if not uuid:
return HttpResultResponse(code=500, msg='请输入uuid')
consumable = account_money(uuid)
return HttpResultResponse(data=consumable)
@router.post("/query/uuid")
def query_uuid_account(data: UserNumber, token=Depends(login_required), db: Session = Depends(get_db)):
def query_uuid_account(data: UserNumber, token=Depends(login_required)):
"""uuid user_number查询"""
user_info = query_uuid_or_user_number(db, data)
user_info = query_uuid_or_user_number(data)
return HttpResultResponse(data=user_info)
......@@ -122,7 +131,7 @@ def account_transfer_money(data: CreateBill, request: Request,
@router.post("/guild/update")
def guild_update_list(data: schemas.GuildUpdate,token=Depends(login_required)):
def guild_update_list(data: schemas.GuildUpdate, token=Depends(login_required)):
"""公会结算"""
GuildSet().update_guild_info(data)
return HttpResultResponse()
......@@ -158,7 +167,8 @@ def recovery_fix(page: int,
end_time: Optional[str] = "",
token=Depends(login_required)):
"""异常数据修复列表"""
recovery_list, total = guild.recovery_fix_data(page=page, size=size, uuid=uuid, start_time=start_time, end_time=end_time)
recovery_list, total = guild.recovery_fix_data(page=page, size=size, uuid=uuid, start_time=start_time,
end_time=end_time)
return HttpResultResponse(total=total, data=recovery_list)
......
......@@ -12,23 +12,22 @@ from qcloud_cos import CosS3Client
SITE_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
FILE_PATH = os.path.join(SITE_ROOT, "runtime", "images")
region ='ap-guangzhou'
region = 'ap-guangzhou'
token = None
scheme ='https'
scheme = 'https'
# Bucket ="3yakj-center-1256890024" #正式桶
Bucket="fj-dc-test-1256890024" #测试桶
Bucket = "fj-dc-test-1256890024" # 测试桶
# Bucket="3yakj" #测试桶
# secret_id='LTAI5t6JyitXaGoGdU7mga7o'
# secret_key='Qg69gRB0vTThX5Ur6tlqgbmvqRaUjE'
secret_id='AKIDra5Ur292g4FCzYrwmMhAOQFsHSP9wb3S'
secret_key='JRKyzpSr1wc5OXXUFsGPKtKfsvqcEcqw'
secret_id = 'AKIDra5Ur292g4FCzYrwmMhAOQFsHSP9wb3S'
secret_key = 'JRKyzpSr1wc5OXXUFsGPKtKfsvqcEcqw'
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
client = CosS3Client(config)
COS_PATH ='https://fj-dc-test-1256890024.cos.ap-guangzhou.myqcloud.com' #测试
COS_RERURN_PATH='/images/'
COS_PATH = 'https://fj-dc-test-1256890024.cos.ap-guangzhou.myqcloud.com' # 测试
COS_RERURN_PATH = '/images/'
class Env(BaseSettings):
......
......@@ -97,9 +97,9 @@ def search(params, method):
}
response = requests.post(url=url, headers=header, json=params)
if response.status_code != 200:
return {"status": 0}
return {}
text = json.loads(response.text)
return {"status": 1, 'data': text.get('data').get("result")}
return text
def get_ip():
......
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