Commit 7ca70078 authored by xianyang's avatar xianyang

优化user_id 查询,账户第二层分组数据

parent f87b375a
......@@ -158,56 +158,76 @@ def update_account_info(old_data):
print(e)
def get_finance_group_by(date, condition):
"""账户财务信息-分组"""
assets_sql = f"select FROM_UNIXTIME(create_time,'%Y%m%d') as create_time,type,SUM(cast(amount as decimal(20,6)))/1000 as amount from {date} WHERE {' and '.join(condition)} GROUP BY FROM_UNIXTIME(create_time,'%y%m%d'),type ORDER BY FROM_UNIXTIME(create_time,'%y%m%d') DESC"
result = LinkMysql(env.DB_HISTORY).query_mysql(assets_sql)
return result
def get_finance_info(unique_tag, page, size, start_time, end_time, is_list=None):
"""账户财务信息"""
finance_condition = []
month, last_month, before_last_month = get_last_month()
if start_time:
finance_condition.append(f"create_time >= {time_str_to_timestamp(start_time + ' 00:00:00')} ")
if end_time:
finance_condition.append(f"create_time < {time_str_to_timestamp(end_time + ' 23:59:59')} ")
if unique_tag == 'guild_account':
if finance_condition:
count_sql = f"select create_time from v3_guild_account_statistics_copy where {' and '.join(finance_condition)} GROUP BY create_time"
data_sql = f"select id,initial_money as balance,income,outcome,create_time from v3_guild_account_statistics_copy where {' and '.join(finance_condition)} GROUP BY create_time order by create_time DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select create_time from v3_guild_account_statistics_copy GROUP BY create_time"
data_sql = f"select id,initial_money as balance,income,outcome,create_time from v3_guild_account_statistics_copy GROUP BY create_time order by create_time DESC limit {(int(page) - 1) * size},{size}"
elif unique_tag == 'user_account':
if finance_condition:
condition = [i.replace('create_time', 'calculation_time') for i in finance_condition]
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=1 and {' and '.join(condition)} GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=1 and {' and '.join(condition)} GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=1 GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=1 GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
elif unique_tag == 'knapsack_account':
if finance_condition:
condition = [i.replace('create_time', 'calculation_time') for i in finance_condition]
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=4 and {' and '.join(condition)} GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=4 and {' and '.join(condition)} GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=4 GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=4 GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
elif unique_tag == 'pledgeDeduction':
if finance_condition:
condition = [i.replace('create_time', 'calculation_time') for i in finance_condition]
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=5 and {' and '.join(condition)} GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=5 and {' and '.join(condition)} GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=5 GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=5 GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
if unique_tag in ['guild_account', 'user_account', 'knapsack_account', 'pledgeDeduction']:
if unique_tag == 'guild_account':
if finance_condition:
count_sql = f"select create_time from v3_guild_account_statistics_copy where {' and '.join(finance_condition)} GROUP BY create_time"
data_sql = f"select id,initial_money as balance,income,outcome,create_time from v3_guild_account_statistics_copy where {' and '.join(finance_condition)} GROUP BY create_time order by create_time DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select create_time from v3_guild_account_statistics_copy GROUP BY create_time"
data_sql = f"select id,initial_money as balance,income,outcome,create_time from v3_guild_account_statistics_copy GROUP BY create_time order by create_time DESC limit {(int(page) - 1) * size},{size}"
if unique_tag == 'user_account':
if finance_condition:
condition = [i.replace('create_time', 'calculation_time') for i in finance_condition]
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=1 and {' and '.join(condition)} GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=1 and {' and '.join(condition)} GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=1 GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=1 GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
if unique_tag == 'knapsack_account':
if finance_condition:
condition = [i.replace('create_time', 'calculation_time') for i in finance_condition]
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=4 and {' and '.join(condition)} GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=4 and {' and '.join(condition)} GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=4 GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=4 GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
if unique_tag == 'pledgeDeduction':
if finance_condition:
condition = [i.replace('create_time', 'calculation_time') for i in finance_condition]
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=5 and {' and '.join(condition)} GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=5 and {' and '.join(condition)} GROUP BY calculation_time order by calculation_time DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select calculation_time from finance_data_calculation_sum_copy where type=5 GROUP BY calculation_time"
data_sql = f"select id,initial_money as balance,income,outcome,calculation_time as create_time from finance_data_calculation_sum_copy where type=5 GROUP BY calculation_time order by calculation_time 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)
future2 = pool.submit(LinkMysql(env.DB_3YV2).query_mysql, data_sql)
count = future1.result()
res = future2.result()
else:
if finance_condition:
count_sql = f"select create_time from v2_system_account_statistics_copy where {' and '.join(finance_condition)} GROUP BY create_time"
data_sql = f"select id,initial_money as balance,income,outcome,create_time from v2_system_account_statistics_copy where {' and '.join(finance_condition)} GROUP BY create_time order by create_time DESC limit {(int(page) - 1) * size},{size}"
else:
count_sql = f"select create_time from v2_system_account_statistics_copy GROUP BY create_time"
data_sql = f"select id,initial_money as balance,income,outcome,create_time from v2_system_account_statistics_copy GROUP BY create_time order by create_time 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)
future2 = pool.submit(LinkMysql(env.DB_3YV2).query_mysql, data_sql)
count = future1.result()
res = future2.result()
total_list = []
fi_sql = f"select uuid from fi_account where unique_tag='{unique_tag}'"
fi_res = LinkMysql(env.DB_3YV2).query_mysql(fi_sql)
finance_condition.append(f" uuid='{fi_res[0]['uuid']}'")
with ThreadPoolExecutor(max_workers=3) as pool:
future1 = pool.submit(get_finance_group_by, 'assets_log_' + month, finance_condition)
future2 = pool.submit(get_finance_group_by, 'assets_log_' + last_month, finance_condition)
future3 = pool.submit(get_finance_group_by, 'assets_log_' + before_last_month, finance_condition)
month_data = future1.result()
last_data = future2.result()
before_last_data = future3.result()
total_list = total_list + month_data if month_data else total_list
total_list = total_list + last_data if last_data else total_list
ultimately_data = total_list + before_last_data if before_last_data else total_list
result = out_income_combine(ultimately_data)
res = result[int(page - 1) * size: page * size]
count = result
# 判断是列表还是导出接口
if is_list:
return res, len(count)
......@@ -261,6 +281,31 @@ def create_type(db: Session, data):
return db_type
def out_income_combine(data):
"""出入账合并"""
record = []
record_dict = {}
for info in data:
res_dict = {'create_time': info.get("create_time"), 'income': 0, 'outcome': 0}
if info.get("create_time") not in record:
record.append(info.get("create_time"))
record_dict[info.get("create_time")] = res_dict
if info.get("type") == 1:
record_dict[info.get("create_time")]['income'] = record_dict[info.get("create_time")]['income'] + float(
info.get("amount"))
else:
record_dict[info.get("create_time")]['outcome'] = record_dict[info.get("create_time")]['outcome'] + float(
info.get("amount"))
res_dict['balance'] = res_dict['income'] - res_dict['outcome']
record_v_list = []
for k, v in record_dict.items():
v['balance'] = v['income'] - v['outcome']
time_arr = time.strptime(v['create_time'], "%Y%m%d")
v['create_time'] = int(time.mktime(time_arr))
record_v_list.append(v)
return record_v_list
class AccountStatistics(object):
"""账户列表,查询"""
......
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