feat:新接口适配,代码优化
This commit is contained in:
@@ -2,6 +2,7 @@ from copy import deepcopy
|
||||
from datetime import datetime, timedelta
|
||||
import json
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from typing import Optional
|
||||
|
||||
from decouple import config
|
||||
import re
|
||||
@@ -82,7 +83,7 @@ def query_room_type(params: dict) -> str:
|
||||
|
||||
|
||||
'''
|
||||
查询租户下会议室信息,没有过滤
|
||||
查询租户下会议室信息,接口过滤根据会议室名称,类型,容量,开始时间和结束时间
|
||||
'''
|
||||
def query_room_info(data: dict, params: dict) -> str:
|
||||
# resp = requests.get('http://127.0.0.1:8000/myapi/room/')
|
||||
@@ -117,8 +118,9 @@ def query_room_info(data: dict, params: dict) -> str:
|
||||
if data.get('Region') and data.get('Region') != 'None':
|
||||
region = data.get('Region')
|
||||
for b in result:
|
||||
logger.info("b.capacity {0} {1}".format(b.get('capacity', 0),type(b.get('capacity', 0))))
|
||||
if ((region in b.get('name', 'default') or region in b.get('typeName', 'default')) and b.get('capacity', 0) >= capacity_limit):
|
||||
logger.info("b.capacity {0} {1}".format(b.get('capacity', 0), type(b.get('capacity', 0))))
|
||||
if ((region in b.get('name', 'default') or region in b.get('typeName', 'default')) and b.get('capacity',
|
||||
0) >= capacity_limit):
|
||||
new_list.append(b)
|
||||
return json.dumps(new_list, ensure_ascii=False)
|
||||
else:
|
||||
@@ -131,11 +133,62 @@ def query_room_info(data: dict, params: dict) -> str:
|
||||
logger.exception("location: query_room_info => {0}".format(str(ex)))
|
||||
return error_respones.format("查询会议室信息")
|
||||
|
||||
'''
|
||||
查询可用会议室信息,
|
||||
包含过滤掉未启用的会议室(接口自动过滤)
|
||||
'''
|
||||
def query_avali_meetinroom_by_interface(data: dict, params: dict) -> str:
|
||||
logger.info(f"当前params : {params} data: {data}")
|
||||
tenant_id = params.get('tenantId', None)
|
||||
try:
|
||||
if not tenant_id:
|
||||
logger.error("query_room_info ,tenantId is None")
|
||||
raise Exception("tenantId 不能为空")
|
||||
access_token = getinfo.get_access_token(tenant_id)
|
||||
params['access_token'] = access_token
|
||||
capacity = data.get('capacity', 0)
|
||||
Region = data.get('Region', None)
|
||||
start_time = data.get('start_time', None)
|
||||
end_time = data.get('end_time', None)
|
||||
params['meetingRoomName'] = Region
|
||||
params['capacity'] = capacity if capacity else 0
|
||||
params['pageNum'] = 1
|
||||
params['pageSize'] = DEFAULT_QUERY_SIZE
|
||||
if not start_time:
|
||||
return json.dumps({"msg": "请确定会议开始-结束时间"}, ensure_ascii=False)
|
||||
if start_time:
|
||||
time_exist = True
|
||||
# 时间格式标准化 2025-05-22 11:00:00
|
||||
start_time = getinfo.standard_format(start_time)
|
||||
# 用户没指定结束时间默认从开始往后推两小时为结束时间
|
||||
if not end_time:
|
||||
end_time = start_time + timedelta(hours=2)
|
||||
else:
|
||||
end_time = getinfo.standard_format(end_time)
|
||||
logger.info("start_time:{0},end_time{1}".format(start_time, end_time))
|
||||
|
||||
params['startTimeStr'] = start_time
|
||||
params['endTimeStr'] = end_time
|
||||
|
||||
# meeting_room = getinfo.query_meetingroom(params)
|
||||
meeting_room = getinfo.query_avali_meetinroom(params)
|
||||
content = json.loads(json.dumps(meeting_room))
|
||||
list = content['data'].get('list', [])
|
||||
result = params_filter.filter_meetingroom(list)
|
||||
logger.info(" filter data: {0}".format(result))
|
||||
result = params_filter.filter_params(result, "query_meeting_room")
|
||||
logger.debug("query_avali_meetinroom_by_interface result => {0}".format(result))
|
||||
return json.dumps(result, ensure_ascii=False)
|
||||
except Exception as ex:
|
||||
logger.exception("location: query_avali_meetinroom_by_interface => {0}".format(str(ex)))
|
||||
return error_respones.format("查询会议室信息")
|
||||
|
||||
|
||||
executor = ThreadPoolExecutor(thread_name_prefix='pool_time_over_leap_check',max_workers=config('PROCESS_ROOM_TIME_OVER_POOL_SIZE',default=20,cast=int))
|
||||
'''
|
||||
多线程任务,判断房间该时段是否被占用
|
||||
'''
|
||||
def executor_task_of_time_over_check(start_time,end_time,meeting_info)->str|None:
|
||||
def executor_task_of_time_over_check(start_time,end_time,meeting_info)-> Optional[str]:
|
||||
logger.info("current meetings {0}".format(meeting_info))
|
||||
for m in meeting_info['meetingDTOList']:
|
||||
m_start_time = getinfo.standard_format(m['startTimeStamp'])
|
||||
@@ -147,7 +200,8 @@ def executor_task_of_time_over_check(start_time,end_time,meeting_info)->str|None
|
||||
return None
|
||||
'''
|
||||
查询可用会议室信息,
|
||||
包含过滤掉未启用的会议室
|
||||
包含过滤掉未启用的会议室(手动过滤)
|
||||
(暂时保留)
|
||||
'''
|
||||
def query_avali_room(data: dict,params: dict,start_time=None,end_time=None) -> str:
|
||||
logger.info(f"query_avali_room params : {params}")
|
||||
@@ -178,7 +232,6 @@ def query_avali_room(data: dict,params: dict,start_time=None,end_time=None) -> s
|
||||
if time_exist:
|
||||
tmp_params = params.copy()
|
||||
tmp_params['pageSize'] = pageSize
|
||||
id_coll = ""
|
||||
room_ids = []
|
||||
for room in meeting_room:
|
||||
room_ids.append(room['id'])
|
||||
@@ -221,8 +274,12 @@ def query_booking_info(params: dict) -> str:
|
||||
raise Exception("tenantId 不能为空")
|
||||
access_token = getinfo.get_access_token(tenant_id)
|
||||
params['access_token'] = access_token
|
||||
params['startTimeStamp'] = get_time_info(0)
|
||||
params['endTimeStamp'] = get_time_info(10)
|
||||
# params['startTimeStamp'] = get_time_info(0)
|
||||
# params['endTimeStamp'] = get_time_info(10)
|
||||
# if not params.get('startTimeStamp', None):
|
||||
# params['startTimeStamp'] = get_time_info(0)
|
||||
# if not params.get('endTimeStamp', None):
|
||||
# params['endTimeStamp'] = get_time_info(10)
|
||||
# 查询所有已预定的会议
|
||||
meeting_room = getinfo.query_meetingbooking_info(params)
|
||||
# 过滤掉已经取消的会议
|
||||
@@ -233,23 +290,29 @@ def query_booking_info(params: dict) -> str:
|
||||
logger.error("location: query_booking_info => {0}".format(str(ex)))
|
||||
return error_respones.format("查询已预定会议")
|
||||
|
||||
|
||||
'''
|
||||
查询户的已预订会议,可指定时间,地区
|
||||
'''
|
||||
def query_booking_info_by_user(params: dict, data=None):
|
||||
logger.info("Start to query_booking_info_by_user")
|
||||
user_id = params.get('user_id', None)
|
||||
user_ids = params.get('userIds', None)
|
||||
params['pageSize'] = by_user_query_size
|
||||
if not user_id:
|
||||
return query_booking_info(params)
|
||||
if not user_ids:
|
||||
raise Exception("userId cannot be null")
|
||||
region = data.get('Region', None)
|
||||
start_time = data.get('start_time', None)
|
||||
end_time = data.get('end_time', None)
|
||||
print("start_time:{0},end_time:{1},user_ids:{2}".format(start_time,end_time,user_ids))
|
||||
if start_time or end_time:
|
||||
# 模型prompt部分已做时间补全处理,这里是为保险起见
|
||||
time_date = getinfo.standard_format(start_time) or getinfo.standard_format(end_time)
|
||||
current_date = time_date.split(' ')[0]
|
||||
mintime = datetime.min.time().strftime('%H:%M:%S')
|
||||
maxtime = datetime.max.time().strftime('%H:%M:%S')
|
||||
start_time = getinfo.standard_format(start_time) or " ".join((current_date, mintime))
|
||||
end_time = getinfo.standard_format(end_time) or " ".join((current_date, maxtime))
|
||||
start_time = parse_time(getinfo.standard_format(start_time) or " ".join((current_date, mintime)))
|
||||
end_time = parse_time(getinfo.standard_format(end_time) or " ".join((current_date, maxtime)))
|
||||
params['startTimeStamp'] = start_time
|
||||
params['endTimeStamp'] = end_time
|
||||
try:
|
||||
all_book_info = query_booking_info(params)
|
||||
if isinstance(all_book_info, dict):
|
||||
@@ -257,40 +320,42 @@ def query_booking_info_by_user(params: dict, data=None):
|
||||
rooms = all_book_info.get("data", [])
|
||||
logger.debug("rooms is {0}".format(rooms))
|
||||
book_info = []
|
||||
# 从所有已预定会议中过滤出当前用户的预定会议
|
||||
# 从所有已预定会议中过滤出符合时间条件和地区条件的
|
||||
if rooms:
|
||||
filter_room = []
|
||||
for room in rooms:
|
||||
room_name = room['meetingDTOList'][0].get('meetingRoomName')
|
||||
|
||||
if region and region not in room_name :
|
||||
continue
|
||||
filtered_meetings = []
|
||||
for meeting in room['meetingDTOList']:
|
||||
if meeting['ownerId'] == user_id:
|
||||
m_start = getinfo.standard_format(meeting['startTimeStamp'])
|
||||
m_end = getinfo.standard_format(meeting['endTimeStamp'])
|
||||
if start_time and end_time:
|
||||
if getinfo.is_time_overlap([start_time, end_time], [m_start, m_end]):
|
||||
filtered_meetings.append(meeting)
|
||||
else:
|
||||
filtered_meetings.append(meeting)
|
||||
|
||||
if filtered_meetings:
|
||||
filter_room = room.copy()
|
||||
filter_room['meetingDTOList'] = filtered_meetings
|
||||
book_info.append(filter_room)
|
||||
book_info.append(room)
|
||||
#接口可以按时间来查询已预订会议,但是无法精确到时间只能精确到日期,下面的手动过滤暂作保留
|
||||
# filtered_meetings = []
|
||||
# for meeting in room['meetingDTOList']:
|
||||
# # if meeting['ownerId'] == user_id:
|
||||
# m_start = getinfo.standard_format(meeting['startTimeStamp'])
|
||||
# m_end = getinfo.standard_format(meeting['endTimeStamp'])
|
||||
# if start_time and end_time:
|
||||
# if getinfo.is_time_overlap([start_time, end_time], [m_start, m_end]):
|
||||
# filtered_meetings.append(meeting)
|
||||
# else:
|
||||
# filtered_meetings.append(meeting)
|
||||
#
|
||||
# if filtered_meetings:
|
||||
# filter_room = room.copy()
|
||||
# filter_room['meetingDTOList'] = filtered_meetings
|
||||
# book_info.append(filter_room)
|
||||
|
||||
result = {'code': all_book_info['code'], 'data': book_info}
|
||||
logger.info("result is -----------",result)
|
||||
return result
|
||||
logger.info("result is -----------",result)
|
||||
return result
|
||||
|
||||
else:
|
||||
raise Exception("query_booking_info failed")
|
||||
# else:
|
||||
# raise Exception("query_booking_info failed")
|
||||
|
||||
except Exception as e:
|
||||
logger.error("location: query_booking_info_by_user => {0}".format(str(e)))
|
||||
return error_respones.format(f"查询指定用户{user_id}已预定会议")
|
||||
|
||||
return error_respones.format(f"查询指定用户{user_ids}已预定会议")
|
||||
|
||||
'''
|
||||
预定会议入口
|
||||
@@ -439,6 +504,16 @@ def check_and_process_think(content: str) -> str:
|
||||
|
||||
def build_prompt(params,map_meetingname_to_id:list):
|
||||
"""构建增强提示词"""
|
||||
|
||||
qry_room_info_for_mart_str = '''
|
||||
{
|
||||
"func_name":"query_room",
|
||||
"capacity":20,
|
||||
"Region":"",
|
||||
"start_time":"",
|
||||
"end_time":"",
|
||||
}
|
||||
'''
|
||||
qry_avail_meetingroom_for_mart_str = '''
|
||||
{
|
||||
|
||||
@@ -528,9 +603,9 @@ def build_prompt(params,map_meetingname_to_id:list):
|
||||
{qry_user_book_info_for_mart_str}
|
||||
```
|
||||
3. 查询会议室信息
|
||||
当用户表达需要查询会议室情况时,实时查询,禁止使用历史对话数据,禁止假设返回信息,直接构造并返回json,示例如下:
|
||||
当用户表达需要查询会议室情况时,实时查询,禁止使用历史对话数据,禁止假设返回信息,(可以根据给出的模糊日期:例如 ‘今天’,‘明天’,然后自动拼接当天的最小时间和最大时间构造开始结束时间)直接构造并返回json,示例如下:
|
||||
```
|
||||
{qry_avail_meetingroom_for_mart_str}
|
||||
{qry_room_info_for_mart_str}
|
||||
```
|
||||
4. 如果用户需要取消预订会议时(会议ID必须由用户提供,不要获取历史消息进行推理),分两种情况:
|
||||
(1)用户未提供要取消的会议号ID,不要使用历史消息进行推理,按照以下的json示例返回:
|
||||
@@ -560,6 +635,7 @@ def build_prompt(params,map_meetingname_to_id:list):
|
||||
9. 当涉及多次查询时,禁止使用历史对话中返回的查询数据,需遵守模板中的步骤重新构造json,调用api查询
|
||||
10.当用户的需求不明确时,禁止猜测推理和查询,请直接询问用户更详细的需求
|
||||
11.如果之前尝试获取信息失败,本次不应受上次影响,可继续操作
|
||||
12.当用户多次预定会议室时,如果用户没明确指定会议室,禁止用之前的预定会议室的信息去直接预定
|
||||
"""
|
||||
return template
|
||||
|
||||
@@ -627,7 +703,9 @@ def process_book_room(data, params) -> tuple:
|
||||
'''
|
||||
def process_query_room(data, params) -> tuple:
|
||||
logger.info("current data is :{}".format(data))
|
||||
result = query_avali_room(data=data, params=params)
|
||||
# result = query_avali_room(data=data, params=params)
|
||||
result = query_avali_meetinroom_by_interface(data, params)
|
||||
book_promot = f''''''
|
||||
logger.info("--process_query_room data is :{}".format(result))
|
||||
book_promot = f'''
|
||||
系统调用API查询现有空闲会议室信息结果如下(如果有一个或多个空闲会议室,必须对返回的会议室按顺序编号):
|
||||
@@ -705,9 +783,10 @@ def process_cancel_room_meeting(data, params) -> tuple:
|
||||
'''
|
||||
def process_query_avali_room(data, params) -> tuple:
|
||||
logger.info("current data is :{}".format(data))
|
||||
start_time = data.get("start_time", None)
|
||||
end_time = data.get("end_time", None)
|
||||
result = query_avali_room(data,params,start_time,end_time)
|
||||
# start_time = data.get("start_time", None)
|
||||
# end_time = data.get("end_time", None)
|
||||
# result = query_avali_room(data,params,start_time,end_time)
|
||||
result = query_avali_meetinroom_by_interface(data=data, params=params)
|
||||
book_promot = f'''
|
||||
系统调用API查询了现有的可用会议室的结果如下(如果有一个或多个可用会议室,必须对返回的会议室按顺序编号):
|
||||
```
|
||||
@@ -822,7 +901,7 @@ def process_chat(covers_id:str,user_id: str, user_input: str, params: dict):
|
||||
if func:
|
||||
# 触发函数调用------
|
||||
logger.info(f"触发系统函数调用==>:{fun_name}")
|
||||
params["user_id"] = user_id
|
||||
params["userIds"] = [user_id]
|
||||
add_to_content, book_promot = func(data=data, params=params)
|
||||
logger.info("test point book_promot => {0} ".format(book_promot))
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ TOKEN_INTF = config('TOKEN_INTF', default="")
|
||||
GATEWAY_INTF = config('GATEWAY_INTF', default="")
|
||||
QUERY_MEETING_ROOM_TYPE = config('QUERY_MEETING_ROOM_TYPE', default="")
|
||||
QUERY_MEETING_ROOM = config('QUERY_MEETING_ROOM', default="")
|
||||
QUERY_AVALI_MEETING_ROOM = config('QUERY_AVALI_MEETING_ROOM', default="")
|
||||
QUERY_MEETINGBOOKING_INFO = config('QUERY_MEETINGBOOKING_INFO', default="")
|
||||
BOOKMEETING = config('BOOKMEETING', default="")
|
||||
CANCEL_MEETING = config('CANCEL_MEETING', default="")
|
||||
@@ -207,7 +208,8 @@ def query_meetingroom(params: dict):
|
||||
gateway_url, token_url = get_domain({"tenantId": tenant_id})
|
||||
request_url = gateway_url + QUERY_MEETING_ROOM
|
||||
logger.info("request url => {0}".format(request_url))
|
||||
params['pageSize'] = page_size
|
||||
if not params.get("pageSize", None):
|
||||
params['pageSize'] = page_size
|
||||
logger.debug("query_meetingroom params => {0}".format(params))
|
||||
respones = requests.get(url=request_url, params=params,
|
||||
headers=header,verify=False)
|
||||
@@ -220,6 +222,30 @@ def query_meetingroom(params: dict):
|
||||
logger.error(error_info)
|
||||
raise Exception(error_info)
|
||||
|
||||
def query_avali_meetinroom(params: dict):
|
||||
logger.info("Start to query meetingroom2")
|
||||
params = deepcopy(params)
|
||||
header = DEFAULT_HEADER.copy()
|
||||
header['yht_access_token'] = params.pop('yht_access_token', None)
|
||||
logger.info("params = > {0} header = > {1}".format(params, header))
|
||||
# params['ytenantId'] = params.pop('tenantId')
|
||||
tenant_id = params.get("tenantId", None)
|
||||
gateway_url, token_url = get_domain({"tenantId": tenant_id})
|
||||
request_url = gateway_url + QUERY_AVALI_MEETING_ROOM
|
||||
logger.info("request url => {0}".format(request_url))
|
||||
if not params.get("pageSize", None):
|
||||
params['pageSize'] = page_size
|
||||
logger.debug("query_avali_meetingroom params => {0}".format(params))
|
||||
respones = requests.get(url=request_url, params=params,
|
||||
headers=header, verify=False)
|
||||
logger.info("avali meeting room respones => {0}".format(respones.text))
|
||||
if respones.status_code == 200:
|
||||
return respones.json()
|
||||
else:
|
||||
error_info = (f"请求查询可用会议室失败 status_code: {respones.status_code} "
|
||||
f"message: {respones.text}")
|
||||
logger.error(error_info)
|
||||
raise Exception(error_info)
|
||||
|
||||
'''
|
||||
查询会议预定信息
|
||||
|
||||
@@ -57,9 +57,8 @@ def filter_state(content: dict):
|
||||
过滤掉未启用的会议室
|
||||
'''
|
||||
def filter_meetingroom(data: dict):
|
||||
new_data = deepcopy(data)
|
||||
filtered_rooms = []
|
||||
if new_data:
|
||||
filtered_rooms = [room for room in new_data if room['state'] in [1]]
|
||||
if data:
|
||||
filtered_rooms = [room for room in data if room['state'] in [1]]
|
||||
|
||||
return filtered_rooms
|
||||
|
||||
Reference in New Issue
Block a user