diff --git a/app/compare_views.py b/app/compare_views.py index a22cea9..ca8f14f 100644 --- a/app/compare_views.py +++ b/app/compare_views.py @@ -50,4 +50,9 @@ def query_usable_survey_crosses_api(): @app.route('/api/query_cross_survey_usable_dates', methods=['GET']) def query_cross_survey_usable_dates_api(): - return query_cross_survey_usable_dates(request.args) \ No newline at end of file + return query_cross_survey_usable_dates(request.args) + + +@app.route('/api/cross_survey_pngs', methods=['GET']) +def cross_survey_pngs_api(): + return query_cross_survey_pngs(request.args) \ No newline at end of file diff --git a/app/cross_compare_common.py b/app/cross_compare_common.py index a6694ff..d34d568 100644 --- a/app/cross_compare_common.py +++ b/app/cross_compare_common.py @@ -21,8 +21,8 @@ def gen_compare_overview_res(eva_overview, comp_eva_overview): 'jam_index': eva_overview['jam_index'], 'comp_jam_index': comp_eva_overview['jam_index'], 'jam_index_color': calc_index_color(eva_overview['jam_index'], comp_eva_overview['jam_index'], 'jam_index'), - 'high_park_percent': eva_overview['high_park_percent'].replace('%', ''), - 'comp_high_park_percent': comp_eva_overview['high_park_percent'].replace('%', ''), + 'high_park_percent': eva_overview['high_park_percent'], + 'comp_high_park_percent': comp_eva_overview['high_park_percent'], 'high_park_percent_color': calc_index_color(float(eva_overview['high_park_percent'].replace('%', '')), float(comp_eva_overview['high_park_percent'].replace('%', '')), 'high_park_percent'), @@ -101,7 +101,7 @@ 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(item_data['service_level'], comp_data['service_level']), + '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), 'high_park_percent': '-' if item_data['high_park_percent'] == '-' or comp_data[ @@ -233,7 +233,11 @@ def parse_comp_inroad_delay_infos(inroad_delay_infos, comp_inroad_delay_infos): 'flow_delay_datas': flow_delay_datas } } - return res + tmp_dict = {v['src_dir']: k for k, v in res.items()} + sorted_tmp_dict = sort_dict_by_clockwise(tmp_dict) + sorted_key = list(sorted_tmp_dict.values()) + final_res = {k: res[k] for k in sorted_key} + return final_res def compare_level(new, old): @@ -407,3 +411,24 @@ def query_compare_data_export_excel(compared_inroad_delay_infos, cross_name,comp mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', as_attachment=True, download_name=file_name) + + +def query_wave_cross_survey_result(userid, crossid): + url = f"http://172.21.32.10:6060/api/get_cross_pngs?userid={userid}&cross_id={crossid}" + headers = {"Content-Type": "application/json"} + response = requests.get(url, headers=headers) + if response.status_code != 200 or response.json()['status'] != 0: + logging.error(f"{crossid}不存在绿波管家的实景勘察结果,查询失败") + return {} + wave_cross_survey_result = json.loads(response.text)['data'] + return wave_cross_survey_result + + +def get_cross_png(image_list): + min_dist = 999999 + res = None + for png_info in image_list: + if 40 < png_info['dist'] < min_dist: + min_dist = png_info['dist'] + res = png_info['image_url'] + return res diff --git a/app/cross_compare_worker.py b/app/cross_compare_worker.py index 092b9e3..0468c5c 100644 --- a/app/cross_compare_worker.py +++ b/app/cross_compare_worker.py @@ -424,11 +424,11 @@ def query_cross_survey_result(params): pos_list = item_csr_data.pos_list image_list = [] for pos in pos_list: - speed = pos.speed - image_time = datetime.fromtimestamp(pos.timestamp).strftime('%Y-%m-%d %H:%M:%S') + speed = pos.pos.speed + image_time = datetime.fromtimestamp(pos.pos.timestamp).strftime('%Y-%m-%d %H:%M:%S') image_url = pos.image_url - image_location = str(pos.lon / 10000000) + ',' + str(pos.lat / 10000000) - dist = pos.dist + image_location = str(pos.pos.lon / 10000000) + ',' + str(pos.pos.lat / 10000000) + dist = pos.pos.dist image_list.append({ 'src_dir': srcDir_toStr(src_dir) + '进口', 'speed': speed, @@ -507,6 +507,89 @@ def rerun_cross_survey_dir(params): return json.dumps(res) +def query_cross_survey_pngs(params): + nodeid = check_param(params, 'nodeid') + if not nodeid: + return json.dumps(make_common_res(2, '缺少nodeid, 请刷新后重试')) + area_id = check_param(params, 'area_id') + if not area_id: + return json.dumps(make_common_res(3, '缺少area_id, 请刷新后重试')) + userid = check_param(params, 'userid') + if not userid: + return json.dumps(make_common_res(4, '缺少userid, 请刷新后重试')) + area_list = db_user.query_areaid_list(userid) + if not area_list or len(area_list) < 1: + return json.dumps(make_common_res(5, '用户信息异常')) + area_list = map(int, 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异常,请检查后重试')) + crossid = check_param(params, 'crossid') + if not crossid: + return json.dumps(make_common_res(6, '缺少路口id,请刷新后重试')) + + wave_cross_survey_result = query_wave_cross_survey_result(userid, crossid) + existed_jobs_list = db_tmnet.query_cross_survey_job(crossid, area_id) + if not existed_jobs_list: + res = make_common_res(0, 'ok') + res['data'] = wave_cross_survey_result + return json.dumps(res) + + job_list = sorted(existed_jobs_list, key=lambda x: x['create_time'], reverse=True) + usable_src_keys = {} + if job_list[0]['status'] != 0: + jobid = job_list[0]['id'] + done_inroads = job_list[0]['done_inroads'] + done_inroads_list = done_inroads.split('|') + for item in done_inroads_list: + if item.split(':')[1] == '2': + item_key = 'csr_' + crossid + '_' + str(jobid) + '_' + item.split(':')[0] + usable_src_keys[item.split(':')[0]] = item_key + if len(job_list) > 1: + jobid = job_list[1]['id'] + done_inroads = job_list[1]['done_inroads'] + done_inroads_list = done_inroads.split('|') + for item in done_inroads_list: + if item.split(':')[0] in usable_src_keys.keys(): + continue + item_key = 'csr_' + crossid + '_' + str(jobid) + '_' + item.split(':')[0] + usable_src_keys[item.split(':')[0]] = item_key + cross_roads_dir_dict = gen_crossids_roads_dir_dict_by_mysql([crossid], nodeid) + road_src_dict = cross_roads_dir_dict[crossid] + for src_dir in usable_src_keys.keys(): + item_key = usable_src_keys[src_dir] + item_data = db_cross.query_csr_data(nodeid, item_key, crossid) + if not item_data: + logging.error('路口id: %s, 任务id: %s, 源方向: %s, 数据不存在' % (crossid, jobid, item)) + continue + item_csr_data = survey_pb.xl_cross_survey_result_t() + item_csr_data.ParseFromString(item_data[0]['data']) + inroadid = item_csr_data.inroadid + if inroadid not in road_src_dict: + logging.error('路口id: %s, 源方向: %s, 数据不存在' % (crossid, inroadid)) + continue + src_dir = road_src_dict[inroadid] + pos_list = item_csr_data.pos_list + image_list = [] + for pos in pos_list: + speed = pos.pos.speed + image_time = datetime.fromtimestamp(pos.pos.timestamp).strftime('%Y-%m-%d %H:%M:%S') + image_url = pos.image_url + image_location = str(pos.pos.lon / 10000000) + ',' + str(pos.pos.lat / 10000000) + dist = pos.pos.dist + image_list.append({ + 'src_dir': srcDir_toStr(src_dir) + '进口', + 'speed': speed, + 'image_time': image_time, + 'image_url': image_url, + 'image_location': image_location, + 'dist': dist + }) + wave_cross_survey_result[src_dir] = get_cross_png(image_list) + res = make_common_res(0, 'ok') + res['data'] = wave_cross_survey_result + return json.dumps(res) + + diff --git a/app/tmnet_db_func.py b/app/tmnet_db_func.py index 363a4bb..5574706 100644 --- a/app/tmnet_db_func.py +++ b/app/tmnet_db_func.py @@ -572,4 +572,4 @@ class TmnetDbHelper(TableDbHelperBase): sql = """ update cross_survey.cross_survey_jobs set status = 0, done_inroads = '%s' where id = %s """ % (done_inroads, jobid) - return self.do_execute(sql) \ No newline at end of file + return self.do_execute(sql)