214 lines
6.9 KiB
Python
214 lines
6.9 KiB
Python
import json
|
||
|
||
from aioredis import Redis
|
||
from fastapi import APIRouter, Depends, Request, File
|
||
from motor.motor_asyncio import AsyncIOMotorDatabase
|
||
import pandas as pd
|
||
|
||
import crud, schemas
|
||
|
||
from api import deps
|
||
from core.config import settings
|
||
from db import get_database
|
||
from db.ckdb import CKDrive, get_ck_db
|
||
from db.redisdb import get_redis_pool
|
||
from utils import estimate_data,dict_to_str
|
||
|
||
router = APIRouter()
|
||
|
||
__all__ = 'router',
|
||
|
||
|
||
@router.get("/attr_list")
|
||
async def read_data_attr(
|
||
request: Request,
|
||
game: str,
|
||
cat: str,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
rdb: Redis = Depends(get_redis_pool),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""事件属性列表或用户属性列表"""
|
||
data = await rdb.get(f'{game}_{cat}')
|
||
data = json.loads(data)
|
||
res = []
|
||
|
||
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': cat})
|
||
data_attr = {item['name']: item for item in data_attr}
|
||
|
||
for k, v in data.items():
|
||
res.append(
|
||
{'name': k,
|
||
'data_type': settings.CK_TYPE_DICT.get(v),
|
||
'show_name': data_attr.get(k, {}).get('show_name', ''),
|
||
'is_show': data_attr.get(k, {}).get('is_show', True),
|
||
'attr_type': '预置属性' if k.startswith('#') else '自定义属性',
|
||
'unit': ''
|
||
}
|
||
)
|
||
return schemas.Msg(code=0, msg='ok', data=res)
|
||
@router.post("/game_user_event_list")
|
||
async def read_data_attr(
|
||
request: Request,
|
||
game: str,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
ck: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""用户搜索时显示的用户属性"""
|
||
# data = await rdb.get(f'{game}_{data_in.cat}')
|
||
# data = json.loads(data)
|
||
# res = list(data.keys())
|
||
#event_columns = await ck.get_columns(game, 'event')
|
||
user_columns = await ck.get_columns(game, 'user')
|
||
data_attr = await crud.data_attr.find_many(db, {'game': game, 'cat': 'user'})
|
||
data_attr = {item['name']: item for item in data_attr}
|
||
user_props = []
|
||
for item in user_columns:
|
||
data_type = settings.CK_TYPE_DICT.get(item['type'])
|
||
title = data_attr.get(item['name'], {}).get('show_name') or item['name']
|
||
user_prop = {
|
||
'id': item['name'],
|
||
'data_type': data_type,
|
||
'title': title,
|
||
}
|
||
user_props.append(user_prop)
|
||
|
||
user_label_props = []
|
||
user_label_docs = await crud.user_label.find_many(db, {'game': game}, {'qp': 0})
|
||
for item in user_label_docs:
|
||
tmp = {
|
||
'id': item['cluster_name'],
|
||
'data_type': 'user_label',
|
||
'title': item['display_name'],
|
||
}
|
||
user_label_props.append(tmp)
|
||
res = [
|
||
{
|
||
'title': '用户属性',
|
||
'id': 'user',
|
||
'category': user_props
|
||
},
|
||
{
|
||
'title': '用户标签',
|
||
'id': 'user_label',
|
||
'category': user_label_props
|
||
}
|
||
]
|
||
return schemas.Msg(code=0, msg='ok', data=res)
|
||
|
||
@router.post("/attr_edit")
|
||
async def edit_data_attr(
|
||
request: Request,
|
||
game: str,
|
||
data_in: schemas.DataAttrEdit,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
rdb: Redis = Depends(get_redis_pool),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""编辑事件属性"""
|
||
await crud.data_attr.edit_data_attr(db, game, data_in)
|
||
return schemas.Msg(code=0, msg='ok', data=data_in)
|
||
|
||
|
||
|
||
# @router.post("/add_select_map")
|
||
# async def add_map(
|
||
# request: Request,
|
||
# game: str,
|
||
# data_in: schemas.SelectMap,
|
||
# db: AsyncIOMotorDatabase = Depends(get_database),
|
||
# current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
# ) -> schemas.Msg:
|
||
# """添加属性值选择映射"""
|
||
#
|
||
# """
|
||
# {
|
||
# game:aaa,
|
||
# attr_name:bbb,
|
||
# map_:{
|
||
# '区服aa':'1',
|
||
# '区服vvv':'5',
|
||
# }
|
||
#
|
||
# }
|
||
# """
|
||
# await crud.select_map.save(db, data_in)
|
||
# return schemas.Msg(code=0, msg='ok', data=data_in)
|
||
|
||
#在gametoos同步区服了,所以不需要这段代码
|
||
@router.post("/add_select_map")
|
||
async def add_select_map(
|
||
request: Request,
|
||
game: str,
|
||
file: bytes = File(...),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""添加游戏区服信息选择映射"""
|
||
dfs = pd.read_excel(file, engine='openpyxl', sheet_name=None)
|
||
for attr_name, df in dfs.items():
|
||
#将id这列转换成字符串类型
|
||
if len(df) >0:
|
||
df['id'] = df['id'].astype(str)
|
||
map_ = df.to_dict('records')
|
||
data_in = schemas.SelectMap(game=game, attr_name=attr_name, map_=map_)
|
||
await crud.select_map.save(db, data_in)
|
||
return schemas.Msg(code=0, msg='ok', data=1)
|
||
|
||
|
||
@router.get("/select_list")
|
||
async def select_list(
|
||
request: Request,
|
||
game: str,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""属性值选择映射列表"""
|
||
#当游戏为魔法门H5时,把game的值改为数据库中对应的值(mdb中的值和ck中的值是不一样的)
|
||
if game == 'mfmh5':
|
||
game='mzmfmh5'
|
||
resp = await crud.select_map.get_list(db, game)
|
||
return schemas.Msg(code=0, msg='ok', data=resp)
|
||
|
||
|
||
@router.post("/select_attr")
|
||
async def select_attr(
|
||
request: Request,
|
||
game: str,
|
||
data_in: schemas.SelectAttr,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""属性值选择映射"""
|
||
resp = await crud.select_map.get_select(db, data_in, game)
|
||
code = 0 if resp else -9
|
||
if 'map_' in resp.keys():
|
||
return schemas.Msg(code=code, msg='ok', data=resp)
|
||
else:
|
||
resp['map_'] = resp.pop('owner_name')
|
||
return schemas.Msg(code=code, msg='ok', data=resp)
|
||
|
||
@router.post("/add_attr")
|
||
async def add_attr(
|
||
request: Request,
|
||
game: str,
|
||
data_in: schemas.Add_attr,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
rdb: Redis = Depends(get_redis_pool),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""添加事件属性或添加用户属性"""
|
||
data = await rdb.get(f'{game}_{data_in.cat}')
|
||
data = json.loads(data)
|
||
if data_in.state =='add':
|
||
#判断传入数据类型
|
||
new_data_type=estimate_data(data_in.data_type)
|
||
#添加数据
|
||
data[data_in.new_attribute]=new_data_type
|
||
else:
|
||
del data[data_in.new_attribute]
|
||
#将字典转为字符串
|
||
str_data=dict_to_str(data)
|
||
await rdb.set(f'{game}_{data_in.cat}',str_data)
|
||
return schemas.Msg(code=0, msg='ok') |