修复路口对比报告bug

This commit is contained in:
wangxu 2026-05-20 18:27:05 +08:00
parent 2a00169095
commit 3a64c328e8
5 changed files with 36 additions and 29 deletions

View File

@ -66,7 +66,7 @@ def gen_compare_report_api():
@app.route('/api/save_report_record', methods=['POST']) @app.route('/api/save_report_record', methods=['POST'])
def save_report_record_api(): def save_report_record_api():
return collect_report(request.args) return collect_report(request.json)
@app.route('/api/query_report_records', methods=['GET']) @app.route('/api/query_report_records', methods=['GET'])

View File

@ -96,11 +96,11 @@ def parse_comp_inroad_delay_infos(inroad_delay_infos, comp_inroad_delay_infos):
diff_data = { diff_data = {
'item': '变化量', 'item': '变化量',
'service_level': '-' if item_data['service_level'] == '-' or comp_data['service_level'] == '-' else compare_level(comp_data['service_level'], item_data['service_level']), 'service_level': '-' if item_data['service_level'] == '-' or comp_data['service_level'] == '-' else compare_level(comp_data['service_level'], item_data['service_level']),
'stop_times': '-' if item_data['stop_times'] == '-' or comp_data['stop_times'] == '-' else round(item_data['stop_times'] - comp_data['stop_times'], 2), 'stop_times': '-' if item_data['stop_times'] == '-' or comp_data['stop_times'] == '-' else round(comp_data['stop_times'] - item_data['stop_times'], 2),
'high_park_percent': '-' if '-' in item_data['high_park_percent'] or '-' in comp_data['high_park_percent'] else str(int(float(item_data['high_park_percent'].replace('%', '')) - float(comp_data['high_park_percent'].replace('%', '')))) + '%', 'high_park_percent': '-' if '-' in item_data['high_park_percent'] or '-' in comp_data['high_park_percent'] else str(int(float(item_data['high_park_percent'].replace('%', '')) - float(comp_data['high_park_percent'].replace('%', '')))) + '%',
'imbalance_index': '-' if item_data['imbalance_index'] == '-' or comp_data['imbalance_index'] == '-' else round(item_data['imbalance_index'] - comp_data['imbalance_index'], 2), 'imbalance_index': '-' if item_data['imbalance_index'] == '-' or comp_data['imbalance_index'] == '-' else round(item_data['imbalance_index'] - comp_data['imbalance_index'], 2),
'park_time': '-' if item_data['park_time'] == '-' or comp_data['park_time'] == '-' else item_data['park_time'] - comp_data['park_time'], 'park_time': '-' if item_data['park_time'] == '-' or comp_data['park_time'] == '-' else item_data['park_time'] - comp_data['park_time'],
'delay_time': '-' if item_data['delay_time'] == '-' or comp_data['delay_time'] == '-' else item_data['delay_time'] - comp_data['delay_time'], 'delay_time': '-' if item_data['delay_time'] == '-' or comp_data['delay_time'] == '-' else comp_data['delay_time'] - item_data['delay_time'],
'speed': '-' if item_data['speed'] == '-' or comp_data['speed'] == '-' else round(item_data['speed'] - comp_data['speed'], 2), 'speed': '-' if item_data['speed'] == '-' or comp_data['speed'] == '-' else round(item_data['speed'] - comp_data['speed'], 2),
'move_speed': '-' if item_data['move_speed'] == '-' or comp_data['move_speed'] == '-' else round(item_data['move_speed'] - comp_data['move_speed'], 2), 'move_speed': '-' if item_data['move_speed'] == '-' or comp_data['move_speed'] == '-' else round(item_data['move_speed'] - comp_data['move_speed'], 2),
'stop_times_color': '-' if item_data['stop_times'] == '-' or comp_data['stop_times'] == '-' else calc_index_color(item_data['stop_times'], comp_data['stop_times'], 'stop_times'), 'stop_times_color': '-' if item_data['stop_times'] == '-' or comp_data['stop_times'] == '-' else calc_index_color(item_data['stop_times'], comp_data['stop_times'], 'stop_times'),

View File

@ -86,7 +86,7 @@ def gen_cross_compare_report(params):
# 验证文件是否已经存在 # 验证文件是否已经存在
cos_client = get_client() cos_client = get_client()
folder_manager = CosFolderManager(cos_client, g_cos_bucket) folder_manager = CosFolderManager(cos_client, g_cos_bucket)
download_url = g_cos_root + f"/user/cross_doctor/platform_report/{nodeid}/{area_id}/cross_compare_report/" + file_name download_url = f"/user/cross_doctor/platform_report/{nodeid}/{area_id}/cross_compare_report/" + file_name + '.docx'
if folder_manager.file_exists(download_url): if folder_manager.file_exists(download_url):
res = make_common_res(0, 'ok') res = make_common_res(0, 'ok')
res['data'] = { res['data'] = {
@ -100,7 +100,7 @@ def gen_cross_compare_report(params):
'weekdays': weekdays, 'weekdays': weekdays,
'compare_date_range': compare_date_range, 'compare_date_range': compare_date_range,
'weekday_str': gen_weekday_str(weekdays), 'weekday_str': gen_weekday_str(weekdays),
'download_url': download_url 'download_url': g_cos_root + download_url
} }
return json.dumps(res, ensure_ascii=False) return json.dumps(res, ensure_ascii=False)
@ -111,13 +111,14 @@ def gen_cross_compare_report(params):
with open(localfile_path, 'w') as f: with open(localfile_path, 'w') as f:
pass pass
doc1 = DocDocumentContrastCtx(str(nodeid)) doc1 = DocDocumentContrastCtx(str(nodeid))
if cut_images == 1: if int(cut_images) == 1:
doc1.cut_image = 1 doc1.cut_image = 1
doc1.area_id = area_id doc1.area_id = int(area_id)
doc1.crossid = crossid doc1.crossid = crossid
doc1.cross_name = cross_static_info['name'] doc1.cross_name = cross_static_info['name']
doc1.time_list = date_list doc1.time_list = date_list
doc1.tp = time_range doc1.tp = time_range
logging.info(doc1.cut_image, doc1.area_id, doc1.crossid, doc1.cross_name, doc1.time_list, doc1.tp)
# 必要数据获取 # 必要数据获取
cross_delay_data_list = db_cross.query_cross_delay_info(crossid, nodeid, date_list, tp_start) cross_delay_data_list = db_cross.query_cross_delay_info(crossid, nodeid, date_list, tp_start)
avg_cross_delay_info = gen_avg_cross_delay_pb(cross_delay_data_list, weekdays) avg_cross_delay_info = gen_avg_cross_delay_pb(cross_delay_data_list, weekdays)
@ -141,7 +142,7 @@ def gen_cross_compare_report(params):
comp_road_flow_delay_infos = gen_road_delay_index(avg_comp_cross_delay_info, roads_dir_dict) comp_road_flow_delay_infos = gen_road_delay_index(avg_comp_cross_delay_info, roads_dir_dict)
compared_inroad_delay_infos = parse_comp_inroad_delay_infos(road_flow_delay_infos, comp_road_flow_delay_infos) compared_inroad_delay_infos = parse_comp_inroad_delay_infos(road_flow_delay_infos, comp_road_flow_delay_infos)
# 装配数据 # 装配数据
title = f"{cross_static_info['name']}路口优化对比报告" title = f"{cross_static_info['name']}"
doc1.title = title doc1.title = title
part1_data = gen_compare_report_part1_data(data_range, compare_date_range, time_range, cross_static_info['name'], final_overview) part1_data = gen_compare_report_part1_data(data_range, compare_date_range, time_range, cross_static_info['name'], final_overview)
if 'part1' in parts: if 'part1' in parts:
@ -173,7 +174,7 @@ def gen_cross_compare_report(params):
doc1.tpl_paragraph['part2']['part2_3'] = 1 doc1.tpl_paragraph['part2']['part2_3'] = 1
part2_3_data = gen_compare_report_part2_3_data(road_flow_turn_rate, avg_cross_delay_info, inroad_static_info_dict) part2_3_data = gen_compare_report_part2_3_data(road_flow_turn_rate, avg_cross_delay_info, inroad_static_info_dict)
detail1 = PartDetail() detail1 = PartDetail()
detail1.detail = "根据车辆分流转向比分析,?进口道流量占比最大为??进口道流量占比最小为?。路口的主要车流方向为?" detail1.detail = "根据车辆分流转向比分析,?进口道流量占比最大为??进口道流量占比最小为?。路口的主要车流方向为??"
detail1.detail_value = [part2_3_data['max_src_dir'], part2_3_data['max_flow_rate'], part2_3_data['min_src_dir'], part2_3_data['min_flow_rate'], part2_3_data['main_flow_str'], part2_3_data['main_flow_detail']] detail1.detail_value = [part2_3_data['max_src_dir'], part2_3_data['max_flow_rate'], part2_3_data['min_src_dir'], part2_3_data['min_flow_rate'], part2_3_data['main_flow_str'], part2_3_data['main_flow_detail']]
doc1.tpl_data['part2_3'].table = [detail1] doc1.tpl_data['part2_3'].table = [detail1]
if 'part3' in parts: if 'part3' in parts:
@ -224,7 +225,7 @@ def gen_cross_compare_report(params):
file_stream.seek(0) file_stream.seek(0)
cos_path = f'user/cross_doctor/platform_report/{nodeid}/{area_id}/cross_compare_report' cos_path = f'user/cross_doctor/platform_report/{nodeid}/{area_id}/cross_compare_report'
folder_manager.ensure_folder(cos_path) folder_manager.ensure_folder(cos_path)
cos_key = f"{cos_path}/{cross_static_info['name']}路口优化对比报告.docx" cos_key = f"{cos_path}/{file_name}.docx"
cos_client.put_object(Bucket=g_cos_bucket, Key=cos_key, Body=file_stream) cos_client.put_object(Bucket=g_cos_bucket, Key=cos_key, Body=file_stream)
download_url = f'{g_cos_root}/{cos_key}' download_url = f'{g_cos_root}/{cos_key}'
res = make_common_res(0, 'ok') res = make_common_res(0, 'ok')
@ -271,13 +272,13 @@ def gen_compare_report_part1_data(data_range, compare_date_range, time_range, cr
if key == 'high_park_percent': if key == 'high_park_percent':
final_overview[key] = int(final_overview[key].replace('%', '')) final_overview[key] = int(final_overview[key].replace('%', ''))
final_overview[compare_key] = int(final_overview[compare_key].replace('%', '')) final_overview[compare_key] = int(final_overview[compare_key].replace('%', ''))
if final_overview[compare_key] and final_overview[key] and final_overview[compare_key] > final_overview[key]: if final_overview[compare_key] and final_overview[key] and final_overview[key] != '-' and final_overview[compare_key] != '-' and final_overview[compare_key] > final_overview[key]:
rate = round((final_overview[key] - final_overview[compare_key]) / final_overview[compare_key] * 100, 2) if final_overview[compare_key] != '-' and final_overview[compare_key] > 0 else 0 rate = round((final_overview[key] - final_overview[compare_key]) / final_overview[compare_key] * 100, 2) if final_overview[compare_key] > 0 else 0
compare_res_str = f"{index_dict[key]}{final_overview[compare_key]}下降为{final_overview[key]} 减少{round(final_overview[key] - final_overview[compare_key], 2)},优化率为{rate}%" compare_res_str = f"{index_dict[key]}{final_overview[compare_key]}下降为{final_overview[key]} 减少{round(final_overview[key] - final_overview[compare_key], 2)},优化率为{rate}%"
part1_data['data_list'].append(compare_res_str) part1_data['data_list'].append(compare_res_str)
else: else:
if final_overview[compare_key] and final_overview[key] and final_overview[compare_key] < final_overview[key]: if final_overview[compare_key] and final_overview[key] and final_overview[key] != '-' and final_overview[compare_key] != '-' and final_overview[compare_key] < final_overview[key]:
rate = round((final_overview[compare_key] - final_overview[key]) / final_overview[compare_key] * 100, 2) if final_overview[compare_key] != '-' and final_overview[compare_key] > 0 else 0 rate = round((final_overview[compare_key] - final_overview[key]) / final_overview[compare_key] * 100, 2) if final_overview[compare_key] > 0 else 0
compare_res_str = f"{index_dict[key]}{final_overview[compare_key]}Km/h提升为{final_overview[key]}km/h 提升{round(final_overview[key] - final_overview[compare_key], 2)}km/h提升率为{rate}%" compare_res_str = f"{index_dict[key]}{final_overview[compare_key]}Km/h提升为{final_overview[key]}km/h 提升{round(final_overview[key] - final_overview[compare_key], 2)}km/h提升率为{rate}%"
part1_data['data_list'].append(compare_res_str) part1_data['data_list'].append(compare_res_str)
return part1_data return part1_data
@ -460,16 +461,16 @@ def gen_compare_report_part5_data(part1_data, compared_inroad_delay_infos):
service_level_compare_str = f"{index_dict[key]}{compare_data[key]}提升为{item_data[key]} 提升{service_level_compare_res}个等级;" service_level_compare_str = f"{index_dict[key]}{compare_data[key]}提升为{item_data[key]} 提升{service_level_compare_res}个等级;"
src_dir_data.append(service_level_compare_str) src_dir_data.append(service_level_compare_str)
elif key in ('stop_times', 'high_park_percent', 'delay_time'): elif key in ('stop_times', 'high_park_percent', 'delay_time'):
if compare_data[key] and item_data[key] and compare_data[key] > item_data[key]:
if key == 'high_park_percent': if key == 'high_park_percent':
item_data[key] = int(item_data[key].replace('%', '')) item_data[key] = int(item_data[key].replace('%', ''))
compare_data[key] = int(compare_data[key].replace('%', '')) compare_data[key] = int(compare_data[key].replace('%', ''))
rate = round((item_data[key] - compare_data[key]) / compare_data[key] * 100, 2) if compare_data[key] != '-' and compare_data[key] > 0 else 0 if compare_data[key] and item_data[key] and compare_data[key] != '-' and item_data[key] != '-' and compare_data[key] > item_data[key]:
rate = round((compare_data[key] - item_data[key]) / compare_data[key] * 100, 2) if compare_data[key] > 0 else 0
compare_res_str = f"{index_dict[key]}{compare_data[key]}下降为{item_data[key]} 减少{diff_data[key]},优化率为{rate}%" compare_res_str = f"{index_dict[key]}{compare_data[key]}下降为{item_data[key]} 减少{diff_data[key]},优化率为{rate}%"
src_dir_data.append(compare_res_str) src_dir_data.append(compare_res_str)
else: else:
if compare_data[key] and item_data[key] and compare_data[key] < item_data[key]: if compare_data[key] and item_data[key] and compare_data[key] != '-' and item_data[key] != '-' and compare_data[key] < item_data[key]:
rate = round((compare_data[key] - item_data[key]) / compare_data[key] * 100, 2) if compare_data[key] != '-' and compare_data[key] > 0 else 0 rate = round((item_data[key] - compare_data[key]) / compare_data[key] * 100, 2) if compare_data[key] > 0 else 0
compare_res_str = f"{index_dict[key]}{compare_data[key]}Km/h提升为{item_data[key]}km/h 提升{diff_data[key]}km/h提升率为{rate}%" compare_res_str = f"{index_dict[key]}{compare_data[key]}Km/h提升为{item_data[key]}km/h 提升{diff_data[key]}km/h提升率为{rate}%"
src_dir_data.append(compare_res_str) src_dir_data.append(compare_res_str)
if len(src_dir_data) > 0: if len(src_dir_data) > 0:
@ -522,12 +523,12 @@ def collect_report(params):
if not download_url: if not download_url:
return json.dumps(make_common_res(8, '缺少下载地址,请刷新后重试')) return json.dumps(make_common_res(8, '缺少下载地址,请刷新后重试'))
report_type = check_param(params, 'report_type') report_type = check_param(params, 'report_type')
if not report_type or report_type not in(0, 1, 2, 3): if not report_type or int(report_type) not in (1, 2, 3):
# 0 对比报告 ,其余为预留 # 0 对比报告 ,其余为预留
return json.dumps(make_common_res(7, '缺少报告类型,请刷新后重试')) return json.dumps(make_common_res(7, '缺少报告类型,请刷新后重试'))
report_type = int(report_type) report_type = int(report_type)
ret = None ret = None
if report_type == 0: if report_type == 1:
date_range = check_param(params, 'date_range') date_range = check_param(params, 'date_range')
if not date_range: if not date_range:
return json.dumps(make_common_res(8, '缺少时间范围, 请刷新后重试')) return json.dumps(make_common_res(8, '缺少时间范围, 请刷新后重试'))
@ -544,8 +545,10 @@ def collect_report(params):
if not gen_report_date: if not gen_report_date:
return json.dumps(make_common_res(12, '缺少生成时间, 请刷新后重试')) return json.dumps(make_common_res(12, '缺少生成时间, 请刷新后重试'))
ret = db_tmnet.save_collect_report(report_type, params) ret = db_tmnet.save_collect_report(report_type, params)
logging.info(ret)
if ret: if ret:
return json.dumps(make_common_res(0, 'ok')) return json.dumps(make_common_res(0, 'ok'))
return json.dumps(make_common_res(13, '保存记录信息失败'))
def query_collect_report_record(params): def query_collect_report_record(params):
@ -565,7 +568,7 @@ def query_collect_report_record(params):
if not str(area_id).lstrip('-').isdigit() or int(area_id) not in area_list: if not str(area_id).lstrip('-').isdigit() or int(area_id) not in area_list:
return json.dumps(make_common_res(5, '辖区id异常请检查后重试')) return json.dumps(make_common_res(5, '辖区id异常请检查后重试'))
report_type = check_param(params, 'report_type') report_type = check_param(params, 'report_type')
if not report_type or int(report_type) not in (0, 1, 2, 3): if not report_type or int(report_type) not in (1, 2, 3):
# 0 对比报告 ,其余为预留 # 0 对比报告 ,其余为预留
return json.dumps(make_common_res(7, '缺少报告类型,请刷新后重试')) return json.dumps(make_common_res(7, '缺少报告类型,请刷新后重试'))
report_type = int(report_type) report_type = int(report_type)

View File

@ -1,4 +1,5 @@
import json import json
import logging
from datetime import datetime from datetime import datetime
from app.db_func_base import TableDbHelperBase from app.db_func_base import TableDbHelperBase
@ -793,11 +794,14 @@ class TmnetDbHelper(TableDbHelperBase):
def save_collect_report(self, report_type, values): def save_collect_report(self, report_type, values):
ret = None ret = None
page_params = json.dumps(values['page_params'], ensure_ascii=False) if values.get('page_params') else None page_params = values["page_params"] if "page_params" in values else None
if report_type == 0: page_params["report_params_detail"] = json.loads(page_params["report_params_detail"]) if "report_params_detail" in page_params else None
final_json_string = json.dumps(page_params, ensure_ascii=False)
if report_type == 1:
sql = """ sql = """
insert into cross_doctor_config.collect_report_record (crossid, cross_name, date_range, compare_date_range, time_range, weekday_str, gen_report_dater, download_url, nodeid, area_id, page_params, report_type) value (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) insert into cross_doctor_config.collect_report_record (crossid, cross_name, date_range, compare_date_range, time_range, weekday_str, gen_report_date, download_url, nodeid, area_id, page_params, report_type) value ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')
""" % (values['crossid'], values['cross_name'], values['date_range'], values['compare_date_range'], values['time_range'], values['weekday_str'], values['gen_report_date'], values['download_url'], values['nodeid'], values['area_id'], page_params, int(values['report_type'])) """ % (values['crossid'], values['cross_name'], values['date_range'], values['compare_date_range'], values['time_range'], values['weekday_str'], values['gen_report_date'], values['download_url'], values['nodeid'], values['area_id'], final_json_string, int(values['report_type']))
logging.info(sql)
ret = self.do_execute(sql) ret = self.do_execute(sql)
if ret == 1: if ret == 1:
return True return True

View File

@ -156,7 +156,7 @@ class CosFolderManager:
try: try:
# 2. 调用 SDK 自带的 object_exists 方法进行判断 # 2. 调用 SDK 自带的 object_exists 方法进行判断
return self.client.object_exists(Bucket=self.bucket, Key=key) return self.client.object_exists(Bucket=self.bucket, Key=file_path)
except Exception as e: except Exception as e:
# 3. 捕获其他可能的异常(如网络错误、权限不足等),按需处理 # 3. 捕获其他可能的异常(如网络错误、权限不足等),按需处理
print(f"检查文件存在性时发生错误: {e}") print(f"检查文件存在性时发生错误: {e}")