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 @@ ...@@ -6,7 +6,7 @@
<excludeFolder url="file://$MODULE_DIR$/fs-env" /> <excludeFolder url="file://$MODULE_DIR$/fs-env" />
<excludeFolder url="file://$MODULE_DIR$/venv" /> <excludeFolder url="file://$MODULE_DIR$/venv" />
</content> </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" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
<component name="PyDocumentationSettings"> <component name="PyDocumentationSettings">
......
...@@ -42,10 +42,19 @@ def data_to_file(db, data, name, header): ...@@ -42,10 +42,19 @@ def data_to_file(db, data, name, header):
class RechargeStatement(object): class RechargeStatement(object):
"""充值报表""" """充值报表"""
def __init__(self): def __init__(self):
self.linkmysql=LinkMysql(env.DB_3YV2) self.linkmysql = LinkMysql(env.DB_3YV2)
self.derive_list = [] 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): def query_data(self,page,size,order_number,user_id,sid,start_time,end_time):
query=[] query=[]
if start_time: if start_time:
...@@ -154,6 +163,7 @@ class RechargeStatement(object): ...@@ -154,6 +163,7 @@ class RechargeStatement(object):
class WithdrawStatement(object): class WithdrawStatement(object):
"""提现报表""" """提现报表"""
def __init__(self): def __init__(self):
self.derive_user_list = [] self.derive_user_list = []
self.linkmysql=LinkMysql(env.DB_3YV2) self.linkmysql=LinkMysql(env.DB_3YV2)
...@@ -334,7 +344,6 @@ class WithdrawStatement(object): ...@@ -334,7 +344,6 @@ class WithdrawStatement(object):
return statement_list, count, moeny_data, final_money return statement_list, count, moeny_data, final_money
class FinanceFix(object): class FinanceFix(object):
@staticmethod @staticmethod
...@@ -349,7 +358,7 @@ class FinanceFix(object): ...@@ -349,7 +358,7 @@ class FinanceFix(object):
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 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}" 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: 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}" 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: with ThreadPoolExecutor(max_workers=2) as pool:
future1 = pool.submit(LinkMysql(env.DB_3YV2).query_mysql, count_sql) future1 = pool.submit(LinkMysql(env.DB_3YV2).query_mysql, count_sql)
......
import json
import math import math
import socket import socket
import threading import threading
...@@ -141,43 +142,66 @@ def outon_account_data(db: Session, dbname, params): ...@@ -141,43 +142,66 @@ def outon_account_data(db: Session, dbname, params):
return data, count return data, count
def accout_list_data(db: Session, dbname, params): def accout_list_data(**params):
accout_filters = [] accout_filters = []
if params.get("transfer_name"): 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"): 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"): 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"): if params.get("end_time"):
accout_filters.append(dbname.create_time <= params.get("end_time") + " 23:59:59") accout_filters.append(f" create_time <= {time_str_to_timestamp(params.get('end_time') + ' 23:59:59')} ")
querydata, count = QueryAllData(db, dbname, params, accout_filters).query_data() if accout_filters:
data = [QueryAllData.serialization(item) for item in querydata] count_sql = f"select count(id) as num from fi_transfer_log where {' and '.join(accout_filters)}"
return data, count 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""" """查询uuid和user_number"""
if param.uuid: 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: 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: if not guild:
return {} return {}
return {"nick_name": "(公会)" + guild.guild_name, "uuid": guild.uuid, "is_guild": 1, "id": guild.id} return {"nick_name": "(公会)" + guild[0]['guild_name'], "uuid": guild[0]['uuid'], "is_guild": 1,
return {"nick_name": user.nick_name, "uuid": user.uuid, "is_guild": 0, "id": user.user_id} "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: if param.user_number:
account = db.query(Account).filter(Account.uuid == param.user_number).first() account_sql = f"select id,name,uuid,unique_tag from fi_account where uuid='{param.uuid}' limit 0,1"
return {"nick_name": account.name, "user_id": account.unique_tag, "uuid": account.uuid, "id": account.id} 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() platform_data = search({"uuid": uuid}, 'Server.UserQuery.GetUserAsset')
if not account: if platform_data['status']:
return 0 try:
return account.consumable if account.consumable else 0 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): def query_token(db, h_list):
...@@ -194,58 +218,69 @@ def query_token(db, h_list): ...@@ -194,58 +218,69 @@ def query_token(db, h_list):
return user_info 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() # 转出 request_data = {
transfer = db.query(Account).filter(Account.uuid == data.transfer_id).first() # 转入 "ip": get_ip(),
if float(dst.consumable) < data.amount: "uuid": uuid,
return "账户余额不足" "dst_uuid": dst_uuid,
dst.consumable = float(dst.consumable) - data.amount "reference_number": get_order(),
transfer.consumable = float(transfer.consumable) + data.amount "reference_type": type,
db.commit() "amount": balance,
except Exception as e: "timestamp": get_now_timestamp(),
db.rollback() "amount_type": 'consumable' if amount_type ==1 else 'withdrawable',
return "操作失败" "notify_url": ""
return "" }
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): def transfer_money(db: Session, param, h_list):
"""转账""" """转账"""
user = query_token(db, h_list) user_id = 0
if param.type == 0: if param.type == 0: # 系统转系统
out = db.query(Account).filter(Account.uuid == param.dst_id).first() out_sql = f"select name from fi_account where uuid='{param.dst_id}' limit 0,1"
income = db.query(Account).filter(Account.uuid == param.transfer_id).first() out = LinkMysql(env.DB_3YV2).query_mysql(out_sql)
dst_name = out.name dst_name = out[0]['name']
transfer_name = income.name if param.type == 1: # 系统转个人/公会
if param.type == 1: out_sql = f"select name from fi_account where uuid='{param.dst_id}' limit 0,1"
out = db.query(Account).filter(Account.uuid == param.dst_id).first() out = LinkMysql(env.DB_3YV2).query_mysql(out_sql)
income = db.query(V2User).filter(V2User.uuid == param.transfer_id).first() income_sql = f"select user_id,nick_name from v2_user where uuid='{param.transfer_id}' limit 0,1"
transfer_name = income.nick_name if income else "" income = LinkMysql(env.DB_3YV2).query_mysql(income_sql)
if not income: # income存在用户存在,就不查公会
income = db.query(Guild).filter(Guild.uuid == param.transfer_id).first() if income:
transfer_name = income.guild_name if income else "" user_id = income[0]['user_id']
dst_name = out.name if income else "" dst_name = out[0]['name']
if param.type == 2: if param.type == 2: # 个人/公会转系统
out = db.query(V2User).filter(V2User.uuid == param.dst_id).first() out_sql = f"select nick_name from v2_user where uuid='{param.transfer_id}' limit 0,1"
dst_name = out.nick_name if out else "" out = LinkMysql(env.DB_3YV2).query_mysql(out_sql)
if not out: if out:
out = db.query(Guild).filter(Guild.uuid == param.dst_id).first() dst_name = out[0]['nick_name']
dst_name = out.guild_name if out else "" else:
income = db.query(Account).filter(Account.uuid == param.transfer_id).first() out_guild_sql = f"select guild_name from guild where uuid='{param.transfer_id}'"
transfer_name = income.name if income else "" out_guild = LinkMysql(env.DB_3YV2).query_mysql(out_guild_sql)
# 转账 dst_name = out_guild[0]['guild_name'] if out_guild else ""
is_success = transfer_trigger_task(db, param)
if is_success:
return is_success
try: 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, is_success = transfer_trigger_task(param.dst_id, 0, param.amount, 'platformRecharge', 1,
operator=user.get("username"), transfer_type=param.transfer_type, f"{param.dst_id}给{param.transfer_id}转账", [], 0, param.transfer_id)
create_time=get_now_datetime(), transfer_name=transfer_name) if not is_success['status']:
db.add(present) return is_success
db.commit() user = query_token(db, h_list)
db.refresh(present) 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: except Exception as e:
return e return e
return {} return {}
......
...@@ -109,14 +109,12 @@ class UserNumber(BaseModel): ...@@ -109,14 +109,12 @@ class UserNumber(BaseModel):
class CreateBill(BaseModel): class CreateBill(BaseModel):
dst_id: Optional[str] = "" dst_id: Optional[str] = ""
dst_name: str = "" dst_name: Optional[str] = ""
amount: float amount: Optional[float] = 0.0
transfer_id: Optional[str] = "" transfer_id: Optional[str] = ""
transfer_name: str = ""
remark: Optional[str] = "" remark: Optional[str] = ""
type: int
nick_name: Optional[str] = ""
transfer_type: Optional[str] = "" transfer_type: Optional[str] = ""
type: Optional[int] = None
# @validator('transfer_id') # @validator('transfer_id')
# def transfer_id_must_contain_space(cls, v): # 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 ...@@ -64,7 +64,7 @@ def guild_payment_list(page: Optional[int] = 1, size: Optional[int] = 10,start_t
@router.post('/upload') @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 a_content = a_file
image_name = random_number() image_name = random_number()
cos_path = new_upload_file(a_content, image_name) cos_path = new_upload_file(a_content, image_name)
...@@ -74,37 +74,46 @@ async def uploadFile(a_file: bytes = File(...),token=Depends(login_required),): ...@@ -74,37 +74,46 @@ async def uploadFile(a_file: bytes = File(...),token=Depends(login_required),):
@router.post("/payment/add") @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) transfer_query(data)
return HttpResultResponse(code=200,data='') return HttpResultResponse(code=200,data='')
@router.get("/onaccount") @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, {}) account_list, total = outon_account_data(db, Account, {})
return HttpResultResponse(total=total, data=account_list) return HttpResultResponse(total=total, data=account_list)
@router.post("/transferlist") @router.get("/transferlist")
def outon_account(data: PaymentAccountlList,token=Depends(login_required),db: Session = Depends(get_db)): 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) return HttpResultResponse(total=total, data=account_list)
@router.post("/query/consumable") @router.get("/query/consumable")
def query_account_money(data: UserNumber,token=Depends(login_required),db: Session = Depends(get_db)): def query_account_money(uuid: str, token=Depends(login_required)):
"""查询账户余额""" """查询账户余额"""
consumable = account_money(db, data) if not uuid:
return HttpResultResponse(data=int(consumable)) return HttpResultResponse(code=500, msg='请输入uuid')
consumable = account_money(uuid)
return HttpResultResponse(data=consumable)
@router.post("/query/uuid") @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查询""" """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) return HttpResultResponse(data=user_info)
...@@ -122,7 +131,7 @@ def account_transfer_money(data: CreateBill, request: Request, ...@@ -122,7 +131,7 @@ def account_transfer_money(data: CreateBill, request: Request,
@router.post("/guild/update") @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) GuildSet().update_guild_info(data)
return HttpResultResponse() return HttpResultResponse()
...@@ -158,7 +167,8 @@ def recovery_fix(page: int, ...@@ -158,7 +167,8 @@ def recovery_fix(page: int,
end_time: Optional[str] = "", end_time: Optional[str] = "",
token=Depends(login_required)): 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) return HttpResultResponse(total=total, data=recovery_list)
......
...@@ -12,23 +12,22 @@ from qcloud_cos import CosS3Client ...@@ -12,23 +12,22 @@ from qcloud_cos import CosS3Client
SITE_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SITE_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
FILE_PATH = os.path.join(SITE_ROOT, "runtime", "images") FILE_PATH = os.path.join(SITE_ROOT, "runtime", "images")
region = 'ap-guangzhou'
region ='ap-guangzhou'
token = None token = None
scheme ='https' scheme = 'https'
# Bucket ="3yakj-center-1256890024" #正式桶 # Bucket ="3yakj-center-1256890024" #正式桶
Bucket="fj-dc-test-1256890024" #测试桶 Bucket = "fj-dc-test-1256890024" # 测试桶
# Bucket="3yakj" #测试桶 # Bucket="3yakj" #测试桶
# secret_id='LTAI5t6JyitXaGoGdU7mga7o' # secret_id='LTAI5t6JyitXaGoGdU7mga7o'
# secret_key='Qg69gRB0vTThX5Ur6tlqgbmvqRaUjE' # secret_key='Qg69gRB0vTThX5Ur6tlqgbmvqRaUjE'
secret_id='AKIDra5Ur292g4FCzYrwmMhAOQFsHSP9wb3S' secret_id = 'AKIDra5Ur292g4FCzYrwmMhAOQFsHSP9wb3S'
secret_key='JRKyzpSr1wc5OXXUFsGPKtKfsvqcEcqw' secret_key = 'JRKyzpSr1wc5OXXUFsGPKtKfsvqcEcqw'
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme) config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
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/'
class Env(BaseSettings): class Env(BaseSettings):
......
...@@ -97,9 +97,9 @@ def search(params, method): ...@@ -97,9 +97,9 @@ def search(params, method):
} }
response = requests.post(url=url, headers=header, json=params) response = requests.post(url=url, headers=header, json=params)
if response.status_code != 200: if response.status_code != 200:
return {"status": 0} return {}
text = json.loads(response.text) text = json.loads(response.text)
return {"status": 1, 'data': text.get('data').get("result")} return text
def get_ip(): 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