feat:新接口适配,代码优化

This commit is contained in:
yujj128
2025-07-30 15:37:23 +08:00
parent 52515b603f
commit b52a633f54
3 changed files with 151 additions and 47 deletions

View File

@@ -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))

View File

@@ -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)
'''
查询会议预定信息

View File

@@ -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