修复对比页面产品走查bug

This commit is contained in:
wangxu 2025-12-10 09:49:37 +08:00
parent 58dd09c247
commit ae5307e827
4 changed files with 123 additions and 10 deletions

View File

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

View File

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

View File

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

View File

@ -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)
return self.do_execute(sql)