diff --git a/api/api_v1/endpoints/query.py b/api/api_v1/endpoints/query.py index 4c74943..3ea8ede 100644 --- a/api/api_v1/endpoints/query.py +++ b/api/api_v1/endpoints/query.py @@ -111,8 +111,36 @@ async def event_model_export(request: Request, export = d.to_stream() return StreamingResponse(export, media_type=mime, headers={'Content-Disposition': f'filename="{file_name}"'}) +@router.post("/event_model_pay") +async def event_model_export(request: Request, + game: str, + data_in: schemas.Times, + ckdb: CKDrive = Depends(get_ck_db) + ): + """下载日充总额详细订单数据""" + sql=f"""select * FROM {game}.event WHERE addHours(`#event_time`, 8) >= '{data_in.start_time}' and addHours(`#event_time`, 8) <= '{data_in.end_time}' and `#event_name` = 'pay' and +orderid NOT LIKE '%GM%' order by `#event_time`""" + df = await ckdb.query_dataframe(sql) + list_columns=list(df.columns.values) + drop_list=[] + for i in list_columns: + aa=type(df[i][0]) + if df[i][0] == None or df[i][0] == [] or df[i][0] == '': + drop_list.append(i) + else: + if 'time' in i : + df[i] = df[i].astype(str) + for nu in range(len(df)): + df.replace(to_replace=df[i][nu],value=df[i][nu].split('+')[0],inplace=True) + + df.drop(drop_list, axis=1, inplace=True) + file_name=quote(f'订单详情.xlsx') + mime = mimetypes.guess_type(file_name)[0] + df_to_stream = DfToStream((df, '订单详情')) + with df_to_stream as d: + export = d.to_stream() + return StreamingResponse(export, media_type=mime, headers={'Content-Disposition': f'filename="{file_name}"'}) -# # @router.get("/event_model_export") # async def event_model_export(request: Request, # game: str, @@ -1136,9 +1164,11 @@ async def scatter_model( res = await analysis.scatter_model_sql() except Exception as e: return schemas.Msg(code=-9, msg='报表配置参数异常') + event_type = analysis.events[0]['eventName'] + where = analysis.events[-1]['quotaname'] sql=res['sql'] + columnName = analysis.event_view['groupBy'][-1]['columnName'] if analysis.event_view['groupBy'] != []: - columnName=analysis.event_view['groupBy'][-1]['columnName'] sql=sql.replace(f'toDate(addHours({game}.event."#event_time", 8)) AS date', f'max(`{columnName}`) as va', 1) sql=sql.replace(f'toDate(addHours({game}.event."#event_time", 8)),','',1) df = await ckdb.query_dataframe(sql) @@ -1204,6 +1234,69 @@ async def scatter_model( 'p': p, 'title': '总体'} + return schemas.Msg(code=0, msg='ok', data=resp) + else: + resp = {'list': {}, 'label': [], + 'start_date': res['start_date'], + 'end_date': res['end_date'], + 'time_particle': res['time_particle'], + 'biaotou':columnName + } + labels = [str(i) for i in sorted(df['values'].unique())] + resp['label'] = labels + for key, tmp_df in df.groupby(['va']): + total = len(tmp_df) + if res['time_particle'] == 'total': + dt = '合计' + else: + dt = key + #dt = key.strftime('%Y-%m-%d') + #dt='合计' + + labels_dict = {} + for key2, tmp_df2 in tmp_df.groupby('values'): + label = str(key2) + n = len(tmp_df2) + labels_dict[label] = n + if event_type == 'pay': + # 如需要2之后所有之和,则执行下面代码,返回值为字典的labels_dict01 + labels_dict01 = {} + v = -1 + for i in labels: + v += 1 + if int(i) == 1: + labels_dict01["1"] = labels_dict["1"] + else: + # for number in labels_dict.keys(): + # if number >=i: + values = list(labels_dict.values()) + n = sum(values[v:]) + labels_dict01[i] = n + # 传入百分比数据 + list_p = [] + for i in labels: + number_int = round(labels_dict01.get(i, 0) * 100 / total, 2) + number_str = str(number_int) + '%' + list_p.append(number_str) + + resp['list'][dt] = {'n': [labels_dict01.get(i, 0) for i in labels], 'total': total, + 'p': list_p} + else: + list_p = [] + for i in labels: + number_int = round(labels_dict.get(i, 0) * 100 / total, 2) + number_str = str(number_int) + '%' + list_p.append(number_str) + resp['list'][dt] = {'n': [labels_dict.get(i, 0) for i in labels], 'total': total, + 'p': list_p} + # resp['list'][dt] = {'总体': {'n': [labels_dict.get(i, 0) for i in labels], 'total': total, + # 'p': [round(labels_dict.get(i, 0) * 100 / total, 2) for i in labels]}} + if where == "step_id" and event_type == "guide": + sql = f"""SELECT toDate(addHours({game}.event."#event_time", 8)) AS date, count(DISTINCT {game}.event."#account_id") AS values FROM {game}.event WHERE addHours({game}.event."#event_time", 8) >= '{start_date}' AND addHours({game}.event."#event_time", 8) <= '{end_date}' AND {game}.event."#event_name" = 'create_account' GROUP BY toDate(addHours({game}.event."#event_time", 8)) ORDER BY date""" + df = await ckdb.query_dataframe(sql) + for i in range(len(df)): + resp['list'][str(df['date'][i])]['总体']['total'] = int(df['values'][i]) + return schemas.Msg(code=0, msg='ok', data=resp) else: return schemas.Msg(code=-9, msg='没有添加分组项', data='') diff --git a/schemas/sql.py b/schemas/sql.py index 3085f93..84613d7 100644 --- a/schemas/sql.py +++ b/schemas/sql.py @@ -30,4 +30,8 @@ class Ck_solo_user(BaseModel): account_id : str # #account_id start_time: str # 开始时间 例:2022-04-02 end_time: str # 结束时间 - event_list: List[Dict] =None#事件名 \ No newline at end of file + event_list: List[Dict] =None#事件名 + +class Times(BaseModel): + start_time: str # 开始时间 例:2022-04-02 00:00:00 + end_time: str # 结束时间 \ No newline at end of file