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("/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')