diff --git a/app/compare_views.py b/app/compare_views.py index 272c9ac..0d45e70 100644 --- a/app/compare_views.py +++ b/app/compare_views.py @@ -66,7 +66,7 @@ def gen_compare_report_api(): @app.route('/api/save_report_record', methods=['POST']) def save_report_record_api(): - return collect_report(request.args) + return collect_report(request.json) @app.route('/api/query_report_records', methods=['GET']) diff --git a/app/cross_compare_common.py b/app/cross_compare_common.py index 3199e70..5839408 100644 --- a/app/cross_compare_common.py +++ b/app/cross_compare_common.py @@ -96,11 +96,11 @@ def parse_comp_inroad_delay_infos(inroad_delay_infos, comp_inroad_delay_infos): diff_data = { 'item': '变化量', '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('%', '')))) + '%', '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'], - '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), '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'), diff --git a/app/cross_compare_report.py b/app/cross_compare_report.py index 4bf8f64..ca7734e 100644 --- a/app/cross_compare_report.py +++ b/app/cross_compare_report.py @@ -86,7 +86,7 @@ def gen_cross_compare_report(params): # 验证文件是否已经存在 cos_client = get_client() 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): res = make_common_res(0, 'ok') res['data'] = { @@ -100,7 +100,7 @@ def gen_cross_compare_report(params): 'weekdays': weekdays, 'compare_date_range': compare_date_range, 'weekday_str': gen_weekday_str(weekdays), - 'download_url': download_url + 'download_url': g_cos_root + download_url } return json.dumps(res, ensure_ascii=False) @@ -111,13 +111,14 @@ def gen_cross_compare_report(params): with open(localfile_path, 'w') as f: pass doc1 = DocDocumentContrastCtx(str(nodeid)) - if cut_images == 1: + if int(cut_images) == 1: doc1.cut_image = 1 - doc1.area_id = area_id + doc1.area_id = int(area_id) doc1.crossid = crossid doc1.cross_name = cross_static_info['name'] doc1.time_list = date_list 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) 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) 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 part1_data = gen_compare_report_part1_data(data_range, compare_date_range, time_range, cross_static_info['name'], final_overview) if 'part1' in parts: @@ -173,7 +174,7 @@ def gen_cross_compare_report(params): 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) 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']] doc1.tpl_data['part2_3'].table = [detail1] if 'part3' in parts: @@ -224,7 +225,7 @@ def gen_cross_compare_report(params): file_stream.seek(0) cos_path = f'user/cross_doctor/platform_report/{nodeid}/{area_id}/cross_compare_report' 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) download_url = f'{g_cos_root}/{cos_key}' 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': final_overview[key] = int(final_overview[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]: - 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 + 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] > 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}%;" part1_data['data_list'].append(compare_res_str) else: - if final_overview[compare_key] and final_overview[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 + 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] > 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}%;" part1_data['data_list'].append(compare_res_str) 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}个等级;" src_dir_data.append(service_level_compare_str) 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': - item_data[key] = int(item_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 key == 'high_park_percent': + item_data[key] = int(item_data[key].replace('%', '')) + compare_data[key] = int(compare_data[key].replace('%', '')) + 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}%;" src_dir_data.append(compare_res_str) else: - if 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 + 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((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}%;" src_dir_data.append(compare_res_str) if len(src_dir_data) > 0: @@ -522,12 +523,12 @@ def collect_report(params): if not download_url: return json.dumps(make_common_res(8, '缺少下载地址,请刷新后重试')) 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 对比报告 ,其余为预留 return json.dumps(make_common_res(7, '缺少报告类型,请刷新后重试')) report_type = int(report_type) ret = None - if report_type == 0: + if report_type == 1: date_range = check_param(params, 'date_range') if not date_range: return json.dumps(make_common_res(8, '缺少时间范围, 请刷新后重试')) @@ -544,8 +545,10 @@ def collect_report(params): if not gen_report_date: return json.dumps(make_common_res(12, '缺少生成时间, 请刷新后重试')) ret = db_tmnet.save_collect_report(report_type, params) + logging.info(ret) if ret: return json.dumps(make_common_res(0, 'ok')) + return json.dumps(make_common_res(13, '保存记录信息失败')) 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: return json.dumps(make_common_res(5, '辖区id异常,请检查后重试')) 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 对比报告 ,其余为预留 return json.dumps(make_common_res(7, '缺少报告类型,请刷新后重试')) report_type = int(report_type) diff --git a/app/tmnet_db_func.py b/app/tmnet_db_func.py index 39594f1..96df708 100644 --- a/app/tmnet_db_func.py +++ b/app/tmnet_db_func.py @@ -1,4 +1,5 @@ import json +import logging from datetime import datetime from app.db_func_base import TableDbHelperBase @@ -793,11 +794,14 @@ class TmnetDbHelper(TableDbHelperBase): def save_collect_report(self, report_type, values): ret = None - page_params = json.dumps(values['page_params'], ensure_ascii=False) if values.get('page_params') else None - if report_type == 0: + page_params = values["page_params"] if "page_params" in values else None + 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 = """ - 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) - """ % (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'])) + 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'], final_json_string, int(values['report_type'])) + logging.info(sql) ret = self.do_execute(sql) if ret == 1: return True diff --git a/tool/qcos_func.py b/tool/qcos_func.py index 2458bf2..e580268 100644 --- a/tool/qcos_func.py +++ b/tool/qcos_func.py @@ -156,7 +156,7 @@ class CosFolderManager: try: # 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: # 3. 捕获其他可能的异常(如网络错误、权限不足等),按需处理 print(f"检查文件存在性时发生错误: {e}")