Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
financial-system
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
xianyang
financial-system
Commits
c2d6a36b
Commit
c2d6a36b
authored
Apr 21, 2023
by
xianyang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
账户类型分类汇总,导出
parent
5ebe5b3e
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
150 additions
and
85 deletions
+150
-85
crud.py
app/api/account/crud.py
+61
-0
schemas.py
app/api/account/schemas.py
+6
-0
views.py
app/api/account/views.py
+37
-1
crud.py
app/api/home/crud.py
+0
-63
views.py
app/api/home/views.py
+2
-19
crud.py
app/api/statement/crud.py
+44
-1
db_link.py
libs/db_link.py
+0
-1
No files found.
app/api/account/crud.py
View file @
c2d6a36b
...
@@ -334,6 +334,13 @@ def out_income_combine(data):
...
@@ -334,6 +334,13 @@ def out_income_combine(data):
return
record_v_list
return
record_v_list
def
query_account_data
():
account_sql
=
f
"select name,unique_tag,uuid from fi_account where unique_tag not "
\
f
"in('guild_account', 'anchor_account', 'user_account', 'knapsack_account')"
account
=
LinkMysql
(
env
.
DB_3YV2
)
.
query_mysql
(
account_sql
)
return
account
class
AccountStatistics
(
object
):
class
AccountStatistics
(
object
):
"""账户列表,查询"""
"""账户列表,查询"""
...
@@ -587,3 +594,57 @@ class SpecificAccountQuery(object):
...
@@ -587,3 +594,57 @@ class SpecificAccountQuery(object):
data_pd
=
pd
.
DataFrame
(
self
.
total_list
)
data_pd
=
pd
.
DataFrame
(
self
.
total_list
)
amount_total
=
data_pd
[
'amount'
]
.
sum
()
amount_total
=
data_pd
[
'amount'
]
.
sum
()
return
res
,
total
,
float
(
amount_total
)
return
res
,
total
,
float
(
amount_total
)
class
HomePageDisplay
(
object
):
def
__init__
(
self
,
date
,
unique_tag
):
self
.
date
=
'assets_log_'
+
date
self
.
unique_tag
=
unique_tag
self
.
account
=
[]
self
.
guild
=
[]
self
.
income
=
0
self
.
outcome
=
0
def
get_month_data
(
self
):
acc_sql
=
"select unique_tag,uuid from fi_account"
guild_sql
=
"select uuid from guild"
with
ThreadPoolExecutor
(
max_workers
=
2
)
as
pool
:
future1
=
pool
.
submit
(
LinkMysql
(
env
.
DB_3YV2
)
.
query_mysql
,
acc_sql
)
future2
=
pool
.
submit
(
LinkMysql
(
env
.
DB_3YV2
)
.
query_mysql
,
guild_sql
)
acc_data
=
future1
.
result
()
guild_data
=
future2
.
result
()
account
=
[
i
[
'uuid'
]
for
i
in
acc_data
]
guild
=
[
i
[
'uuid'
]
for
i
in
guild_data
]
assets_cond
=
[]
if
self
.
unique_tag
==
'guild_account'
:
assets_cond
.
append
(
f
" uuid in{tuple(guild)}"
)
elif
self
.
unique_tag
==
'user_account'
:
assets_cond
.
append
(
f
" uuid not in{tuple(guild + account)} and amount_type in('consumable','withdrawable')"
)
elif
self
.
unique_tag
==
'knapsack_account'
:
assets_cond
.
append
(
f
" amount_type='backpack'"
)
else
:
acc_uuid
=
[
i
[
'uuid'
]
for
i
in
acc_data
if
i
[
'unique_tag'
]
==
self
.
unique_tag
]
if
not
acc_uuid
:
print
(
'没找到系统账户'
)
return
[]
assets_cond
.
append
(
f
" uuid='{acc_uuid[0]}'"
)
assets_sql
=
f
"select reference_type,type,sum(amount) as amount from {self.date} where {' and '.join(assets_cond)} GROUP BY reference_type,type"
total_data
=
LinkMysql
(
env
.
DB_HISTORY
)
.
query_mysql
(
assets_sql
)
# 数据分类
res_list
=
[]
for
i
in
total_data
:
op
=
{}
if
TYPE_NAME
.
get
(
i
[
'reference_type'
]):
op
[
'name'
]
=
TYPE_NAME
.
get
(
i
[
'reference_type'
])
else
:
op
[
'name'
]
=
i
[
'reference_type'
]
if
i
[
'type'
]
==
0
:
op
[
'type'
]
=
'出账'
self
.
outcome
=
self
.
outcome
+
i
[
'amount'
]
else
:
op
[
'type'
]
=
'入账'
self
.
income
=
self
.
income
+
i
[
'amount'
]
op
[
'money'
]
=
round
(
i
[
'amount'
]
/
1000
,
3
)
res_list
.
append
(
op
)
return
res_list
,
self
.
outcome
/
1000
,
self
.
income
/
1000
app/api/account/schemas.py
View file @
c2d6a36b
...
@@ -101,3 +101,9 @@ class RecoveryTable(BaseModel):
...
@@ -101,3 +101,9 @@ class RecoveryTable(BaseModel):
class
RecoveryupdateTable
(
RecoveryTable
):
class
RecoveryupdateTable
(
RecoveryTable
):
id
:
int
id
:
int
class
AccountClassifyData
(
BaseModel
):
date
:
Optional
[
str
]
=
''
unique_tag
:
Optional
[
str
]
=
''
account_type
:
Optional
[
str
]
=
''
app/api/account/views.py
View file @
c2d6a36b
...
@@ -4,7 +4,7 @@ from fastapi import Depends, APIRouter, Request, Query
...
@@ -4,7 +4,7 @@ from fastapi import Depends, APIRouter, Request, Query
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
from
app.api.account.crud
import
AccountStatistics
,
SpecificAccountQuery
from
app.api.account.crud
import
AccountStatistics
,
SpecificAccountQuery
,
HomePageDisplay
from
app.api.statement
import
crud
as
statement_crud
from
app.api.statement
import
crud
as
statement_crud
from
libs
import
functions
from
libs
import
functions
from
libs.functions
import
get_date_list
from
libs.functions
import
get_date_list
...
@@ -179,3 +179,39 @@ def query_guilds_info(uuid: str, token=Depends(login_required)):
...
@@ -179,3 +179,39 @@ def query_guilds_info(uuid: str, token=Depends(login_required)):
return
HttpResultResponse
(
code
=
500
,
msg
=
str
(
res
))
return
HttpResultResponse
(
code
=
500
,
msg
=
str
(
res
))
success
=
json
.
loads
(
res
.
text
)
success
=
json
.
loads
(
res
.
text
)
return
HttpResultResponse
(
data
=
success
.
get
(
'data'
))
return
HttpResultResponse
(
data
=
success
.
get
(
'data'
))
@
router
.
get
(
"/total"
)
def
read_account
(
date
:
Optional
[
str
]
=
""
,
unique_tag
:
Optional
[
str
]
=
""
,
account_type
:
Optional
[
str
]
=
""
,
token
=
Depends
(
login_required
)):
"""月,业务类型,消费类型,出入账目统计"""
if
not
date
or
(
not
unique_tag
and
not
account_type
):
return
HttpResultResponse
(
code
=
500
,
msg
=
HttpMessage
.
MISSING_PARAMETER
)
if
account_type
and
not
unique_tag
:
unique_tag
=
account_type
data
,
out
,
income
=
HomePageDisplay
(
date
,
unique_tag
)
.
get_month_data
()
return
HttpResultResponse
(
outcome
=
out
,
income
=
income
,
data
=
data
)
@
router
.
post
(
"/total/excel"
)
def
account_classify_excel
(
data
:
schemas
.
AccountClassifyData
,
request
:
Request
,
token
=
Depends
(
login_required
),
db
:
Session
=
Depends
(
get_db
)):
"""账户分类汇总导出"""
if
not
data
.
date
or
(
not
data
.
unique_tag
and
not
data
.
account_type
):
return
HttpResultResponse
(
code
=
500
,
msg
=
HttpMessage
.
MISSING_PARAMETER
)
if
data
.
unique_tag
:
unique_tag
=
data
.
unique_tag
else
:
unique_tag
=
data
.
account_type
headers
=
request
.
get
(
"headers"
)
data
,
outcome
,
income
=
HomePageDisplay
(
data
.
date
,
unique_tag
)
.
get_month_data
()
return
statement_crud
.
account_data_to_file
(
db
,
data
,
outcome
,
income
,
headers
)
@
router
.
get
(
"/name/list"
)
def
outon_account
(
token
=
Depends
(
login_required
)):
"""系统账户列表"""
account_list
=
crud
.
query_account_data
()
return
HttpResultResponse
(
data
=
account_list
)
app/api/home/crud.py
View file @
c2d6a36b
import
json
import
threading
from
concurrent.futures.thread
import
ThreadPoolExecutor
import
pandas
as
pd
from
core.config.env
import
env
,
red
from
libs.db_link
import
LinkMysql
class
HomePageDisplay
(
object
):
def
__init__
(
self
,
date
,
unique_tag
,
amount_type
,
reference_type
,
type
):
self
.
date
=
'assets_log_'
+
date
self
.
unique_tag
=
unique_tag
self
.
amount_type
=
amount_type
self
.
reference_type
=
reference_type
self
.
type
=
type
self
.
account
=
[]
self
.
guild
=
[]
self
.
total_money
=
0
def
mysql_query_data
(
self
,
assets_cond
,
page
,
size
):
assets_sql
=
f
"select amount from {self.date} where {' and '.join(assets_cond)} limit {page},{size}"
total_data
=
LinkMysql
(
env
.
DB_HISTORY
)
.
perform_mysql
(
assets_sql
)
df
=
pd
.
DataFrame
(
total_data
)
total
=
df
[
'amount'
]
.
sum
()
self
.
total_money
=
self
.
total_money
+
total
def
get_month_data
(
self
):
acc_sql
=
"select unique_tag,uuid from fi_account"
guild_sql
=
"select uuid from guild"
with
ThreadPoolExecutor
(
max_workers
=
2
)
as
pool
:
future1
=
pool
.
submit
(
LinkMysql
(
env
.
DB_3YV2
)
.
query_mysql
,
acc_sql
)
future2
=
pool
.
submit
(
LinkMysql
(
env
.
DB_3YV2
)
.
query_mysql
,
guild_sql
)
acc_data
=
future1
.
result
()
guild_data
=
future2
.
result
()
account
=
[
i
[
'uuid'
]
for
i
in
acc_data
]
guild
=
[
i
[
'uuid'
]
for
i
in
guild_data
]
assets_cond
=
[]
assets_cond
.
append
(
f
" reference_type='{self.reference_type}'"
)
if
self
.
unique_tag
==
'guild_account'
:
assets_cond
.
append
(
f
" uuid in{tuple(guild)}"
)
elif
self
.
unique_tag
==
'user_account'
:
if
self
.
amount_type
==
0
:
amount_type
=
'consumablel'
else
:
amount_type
=
'withdrawable'
assets_cond
.
append
(
f
" uuid not in{tuple(guild + account)} and amount_type='{amount_type}'"
)
elif
self
.
unique_tag
==
'knapsack_account'
:
assets_cond
.
append
(
f
" amount_type='backpack'"
)
else
:
acc_uuid
=
[
i
[
'uuid'
]
for
i
in
acc_data
if
i
[
'unique_tag'
]
==
self
.
unique_tag
]
if
not
acc_uuid
:
print
(
'没找到系统账户'
)
return
[]
assets_cond
.
append
(
f
" uuid='{acc_uuid[0]}'"
)
assets_sql
=
f
"select amount from {self.date} where {' and '.join(assets_cond)}"
total_data
=
LinkMysql
(
env
.
DB_HISTORY
)
.
query_mysql
(
assets_sql
)
df
=
pd
.
DataFrame
(
total_data
)
df_total
=
df
.
sum
()
total_dict
=
df_total
.
to_dict
()
if
total_data
:
return
total_dict
.
get
(
'amount'
)
/
1000
return
0
app/api/home/views.py
View file @
c2d6a36b
from
typing
import
Optional
from
fastapi
import
APIRouter
,
Depends
from
fastapi
import
APIRouter
from
app.api.home.crud
import
HomePageDisplay
from
libs.result_format
import
HttpResultResponse
,
HttpMessage
from
libs.token_verify
import
login_required
router
=
APIRouter
()
router
=
APIRouter
()
@
router
.
get
(
"/multidimensional/total"
)
def
read_account
(
date
:
Optional
[
str
]
=
""
,
unique_tag
:
Optional
[
str
]
=
""
,
account_type
:
Optional
[
str
]
=
""
,
amount_type
:
Optional
[
str
]
=
""
,
reference_type
:
Optional
[
str
]
=
""
,
type
:
Optional
[
int
]
=
None
,
token
=
Depends
(
login_required
)):
"""月,业务类型,消费类型,出入账目统计"""
if
not
all
([
date
,
reference_type
])
or
type
is
None
or
(
not
unique_tag
and
not
account_type
):
return
HttpResultResponse
(
code
=
500
,
msg
=
HttpMessage
.
MISSING_PARAMETER
)
if
account_type
and
not
unique_tag
:
unique_tag
=
account_type
total
=
HomePageDisplay
(
date
,
unique_tag
,
amount_type
,
reference_type
,
type
)
.
get_month_data
()
return
HttpResultResponse
(
data
=
total
)
app/api/statement/crud.py
View file @
c2d6a36b
...
@@ -3,7 +3,7 @@ import threading
...
@@ -3,7 +3,7 @@ import threading
import
time
import
time
from
concurrent.futures.thread
import
ThreadPoolExecutor
from
concurrent.futures.thread
import
ThreadPoolExecutor
from
datetime
import
datetime
from
datetime
import
datetime
import
xlsxwriter
import
openpyxl
import
openpyxl
import
pandas
as
pd
import
pandas
as
pd
from
fastapi
import
Depends
from
fastapi
import
Depends
...
@@ -53,6 +53,49 @@ def data_to_file(db, data, name, header, field_list):
...
@@ -53,6 +53,49 @@ def data_to_file(db, data, name, header, field_list):
crud
.
create_export_data
(
db
,
params
,
user
)
crud
.
create_export_data
(
db
,
params
,
user
)
# 账户类型导出专用
def
account_data_to_file
(
db
,
data
,
outcome
,
income
,
header
):
user
=
query_token
(
db
,
header
)
params
=
{
"source"
:
'账户类型汇总'
,
"method"
:
"data_to_file"
,
"status"
:
1
}
if
len
(
data
)
==
0
:
params
[
"status"
]
=
3
try
:
income_list
=
[
i
for
i
in
data
if
i
[
'type'
]
==
'入账'
]
outcome_list
=
[
i
for
i
in
data
if
i
[
'type'
]
==
'出账'
]
workbook
=
xlsxwriter
.
Workbook
(
"账户类型汇总.xlsx"
)
worksheet
=
workbook
.
add_worksheet
()
worksheet
.
merge_range
(
"A1:B1"
,
"出账"
)
worksheet
.
write
(
1
,
0
,
'类型'
)
worksheet
.
write
(
1
,
1
,
'金额(元)'
)
row
=
2
col
=
0
for
x
in
outcome_list
:
worksheet
.
write
(
row
,
col
,
x
[
'name'
])
worksheet
.
write
(
row
,
col
+
1
,
x
[
'money'
])
row
+=
1
worksheet
.
write
(
row
,
0
,
'合计'
)
worksheet
.
write
(
row
,
1
,
income
)
row
+=
2
worksheet
.
merge_range
(
f
"A{row}:B{row}"
,
"入账"
)
worksheet
.
write
(
1
,
0
,
'类型'
)
worksheet
.
write
(
1
,
1
,
'金额(元)'
)
for
y
in
income_list
:
worksheet
.
write
(
row
,
col
,
y
[
'name'
])
worksheet
.
write
(
row
,
col
+
1
,
y
[
'money'
])
row
+=
1
worksheet
.
write
(
row
,
0
,
'合计'
)
worksheet
.
write
(
row
,
1
,
outcome
)
workbook
.
close
()
file
=
open
(
"账户类型汇总.xlsx"
,
'rb'
)
# 记录导出
crud
.
create_export_data
(
db
,
params
,
user
)
return
StreamingResponse
(
file
,
media_type
=
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
)
except
Exception
as
e
:
params
[
"status"
]
=
2
crud
.
create_export_data
(
db
,
params
,
user
)
class
RechargeStatement
(
object
):
class
RechargeStatement
(
object
):
"""充值报表"""
"""充值报表"""
...
...
libs/db_link.py
View file @
c2d6a36b
import
json
import
json
import
pymysql
import
pymysql
import
pika
from
DBUtils.PooledDB
import
PooledDB
from
DBUtils.PooledDB
import
PooledDB
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment