fix:未启用会议室过滤+增加已预定按地点或时间查询

This commit is contained in:
yujj128
2025-07-23 15:21:39 +08:00
parent bb621c0567
commit 5f730a0baf
3 changed files with 57 additions and 12 deletions

View File

@@ -148,7 +148,9 @@ def query_avali_room(data: dict,params: dict,start_time=None,end_time=None) -> s
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:
@@ -162,6 +164,7 @@ def query_avali_room(data: dict,params: dict,start_time=None,end_time=None) -> s
raise Exception(f"query_avali_room: 会议室信息获取不符合预期 => {meeting_room}")
unavali_room = []
avali_room = []
# 过滤有时间冲突的会议
if time_exist:
tmp_params = params.copy()
tmp_params['pageSize'] = pageSize
@@ -182,6 +185,7 @@ def query_avali_room(data: dict,params: dict,start_time=None,end_time=None) -> s
m_start_time = getinfo.standard_format(m['startTimeStamp'])
m_end_time = getinfo.standard_format(m['endTimeStamp'])
logger.info("m_start_time:{0},m_end_time:{1}".format(m_start_time, m_end_time))
# 判断会议时间是否与已有会议的会议时间重叠,若有重叠则该会议室存在时间冲突
if getinfo.is_time_overlap([start_time, end_time], [m_start_time, m_end_time]):
logger.info("会议{0}发生时间冲突".format(m))
unavali_room.append(meetings['meetingRoomId'])
@@ -189,7 +193,9 @@ def query_avali_room(data: dict,params: dict,start_time=None,end_time=None) -> s
logger.info("所有发生时间冲突的会议室 => {0}".format(unavali_room))
avali_room = [room for room in meeting_room if room['id'] not in unavali_room]
# 过滤会议室信息里的多余字段
avali_room = params_filter.filter_params(avali_room, "query_meeting_room")
# 返回会议室长度限制
if len(avali_room) >= DEFAULT_QUERY_SIZE:
logger.info("avali_room 长度超出限制")
avali_room = avali_room[:DEFAULT_QUERY_SIZE]
@@ -212,7 +218,9 @@ def query_booking_info(params: dict) -> str:
params['access_token'] = access_token
params['startTimeStamp'] = get_time_info(0)
params['endTimeStamp'] = get_time_info(10)
# 查询所有已预定的会议
meeting_room = getinfo.query_meetingbooking_info(params)
# 过滤掉已经取消的会议
result = params_filter.filter_state(meeting_room)
# print(result)
return json.loads(json.dumps(result))
@@ -221,12 +229,22 @@ def query_booking_info(params: dict) -> str:
return error_respones.format("查询已预定会议")
def query_booking_info_by_user(params: dict):
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)
params['pageSize'] = by_user_query_size
if not user_id:
return query_booking_info(params)
region = data.get('Region', None)
start_time = data.get('start_time', None)
end_time = data.get('end_time', None)
if start_time or end_time:
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))
try:
all_book_info = query_booking_info(params)
if isinstance(all_book_info, dict):
@@ -234,13 +252,29 @@ def query_booking_info_by_user(params: dict):
rooms = all_book_info.get("data", [])
logger.debug("rooms is {0}".format(rooms))
book_info = []
# 从所有已预定会议中过滤出当前用户的预定会议
if rooms:
for room in rooms:
filtered_meetings = [meeting for meeting in room['meetingDTOList'] if meeting['ownerId'] == user_id]
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)
result = {'code': all_book_info['code'], 'data': book_info}
logger.info("result is -----------",result)
return result
@@ -252,11 +286,10 @@ def query_booking_info_by_user(params: dict):
logger.error("location: query_booking_info_by_user => {0}".format(str(e)))
return error_respones.format(f"查询指定用户{user_id}已预定会议")
'''
预定会议
'''
def book_meeting(params: dict, data: dict) -> str:
"""
data {
@@ -432,7 +465,7 @@ def build_prompt(params,map_meetingname_to_id:list):
"func_name":"query_avali_room",
"start_time":"",
"end_time":"",
"Region":""
"Region":"",
"capacity":""
}
'''
@@ -455,7 +488,10 @@ def build_prompt(params,map_meetingname_to_id:list):
'''
qry_user_book_info_for_mart_str = '''
{
"func_name":"query_user_booking_info"
"func_name":"query_user_booking_info",
"Region":"",
"start_time":"",
"end_time":""
}
'''
cancel_meeting_info_for_mart_str = '''
@@ -513,7 +549,7 @@ def build_prompt(params,map_meetingname_to_id:list):
```
{book_for_mart_str}
```
2. 用户需要查询已有的会议室预订情况或者预订情况时,实时查询,禁止使用历史对话数据,禁止假设返回信息直接构造并返回json,示例如下:
2. 用户需要查询已有的会议室预订情况或者会议预订情况时,实时查询,禁止使用历史对话数据,禁止假设返回信息,(会议地区Region会议开始和结束时间可以为空)直接构造并返回json,示例如下:
```
{qry_user_book_info_for_mart_str}
```
@@ -740,7 +776,7 @@ def process_query_book_room(**kwargs) -> tuple:
查询指定用户的已预定信息
'''
def process_user_query_book_room(**kwargs) -> tuple:
result = query_booking_info_by_user(params=kwargs['params'])
result = query_booking_info_by_user(params=kwargs['params'], data=kwargs['data'])
book_promot = f'''
系统调用API查询当前租户下已经预订的会议室的结果如下(如果有一个或多个已预定会议,必须对返回的已预定会议按顺序编号):
{result}
@@ -816,6 +852,7 @@ func_tion_call_map = {
def extract_json_blocks(text):
#过滤出带{}的json块
json_blocks = re.findall(r'\{[^{}]*\}', text)
valid_blocks = []
for block in json_blocks:
@@ -866,10 +903,10 @@ def process_chat(covers_id:str,user_id: str, user_input: str, params: dict):
redis_message_manage.set_history(covers_id, req.all_messages())
content = req.output
logger.info(f"process chat content is : {content}")
content = check_and_process_think(content)
if "func_name" in content:
# 去除think的之前的数据再提取
text = check_and_process_think(content)
json_content = extract_json_blocks(text)
json_content = extract_json_blocks(content)
logger.info("jsoncontent----------{0}".format(json_content))
# if not json_content:
# json_content = extract_json_blocks(content)

View File

@@ -23,7 +23,6 @@ QUERY_MEETING_ROOM = config('QUERY_MEETING_ROOM', default="")
QUERY_MEETINGBOOKING_INFO = config('QUERY_MEETINGBOOKING_INFO', default="")
BOOKMEETING = config('BOOKMEETING', default="")
CANCEL_MEETING = config('CANCEL_MEETING', default="")
# CANCEL_MEETING2 = config('CANCEL_MEETING2', default="")
EDIT_MEETING = config('EDIT_MEETING', default="")
DEFAULT_HEADER = {'Content-Type': 'application/json'}
page_size = config('DEFAULT_PAGESIZE', default=50, cast=int)
@@ -52,6 +51,8 @@ def check_required_params(required_fields, params):
标准时间转化
'''
def standard_format(time_str):
if not time_str:
return
try:
if time_str.isdigit():
logger.info("是时间戳格式")
@@ -101,6 +102,7 @@ def get_access_token(tenant_id):
params['timestamp'] = str(int(time.time() * 1000))
params['appKey'] = APPKEY
app_secret = APPSECRET
# 生成签名
sort_param = sign_opt.opt_sort_data(params)
signature = sign_opt.opt_sha256(app_secret, sort_param)
params["signature"] = signature
@@ -135,6 +137,7 @@ def get_access_token(tenant_id):
获取租户所在中心域名
'''
def get_domain(params):
# 返回的中心域名包含token的以及会议室请求相关的
logger.info(f"Start to get domain , params is {params}")
params = deepcopy(params)
request_url = DEFAULT_AUTH_URL + GATEWAY_INTF

View File

@@ -30,7 +30,9 @@ def filter_params(data, endpoint_name):
return [filter_params(item, endpoint_name) for item in data]
return data
'''
将已取消的从已预定会议中过滤掉
'''
def filter_state(content: dict):
filtered_data = []
for room in content['data']:
@@ -51,6 +53,9 @@ def filter_state(content: dict):
result = {'code': content['code'], 'data': filtered_data}
return result
'''
过滤掉未启用的会议室
'''
def filter_meetingroom(data: dict):
new_data = deepcopy(data)
filtered_rooms = []