提交部分对比相关接口内容
This commit is contained in:
parent
69f7fc30cc
commit
a10a0bdd07
|
|
@ -0,0 +1,33 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# @Author: Owl
|
||||||
|
# @Date: 2025/11/28 16:35
|
||||||
|
# @Description: 路口对比评测相关接口
|
||||||
|
from flask import request
|
||||||
|
|
||||||
|
from app.cross_compare_worker import *
|
||||||
|
from app.cross_eva_views import app
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/cross_compare_data', methods=['POST'])
|
||||||
|
def cross_compare_data():
|
||||||
|
return query_compare_data(request.json)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/do_add_cross_survey_job', methods=['POST'])
|
||||||
|
def do_add_cross_survey_job_api():
|
||||||
|
return do_add_cross_survey_job(request.json)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/del_cross_survey_job', methods=['GET'])
|
||||||
|
def del_cross_survey_job_api():
|
||||||
|
return do_del_cross_survey_job(request.args)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/query_cross_survey_jobs', methods=['GET'])
|
||||||
|
def query_cross_survey_jobs_api():
|
||||||
|
return query_cross_survey_job_list(request.args)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/rerun_cross_survey', methods=['GET'])
|
||||||
|
def rerun_cross_survey_api():
|
||||||
|
return rerun_cross_survey_job(request.args)
|
||||||
|
|
@ -0,0 +1,202 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# @Author: Owl
|
||||||
|
# @Date: 2025/11/27 11:17
|
||||||
|
# @Description: 路口优化对比页面相关公共函数
|
||||||
|
from pypinyin import lazy_pinyin
|
||||||
|
|
||||||
|
from app.eva_common import *
|
||||||
|
|
||||||
|
|
||||||
|
def gen_compare_overview_res(eva_overview, comp_eva_overview):
|
||||||
|
# comp_index 为优化前指标
|
||||||
|
main_flows_num = len(eva_overview['main_flow_src_desc'].split('、'))
|
||||||
|
comp_main_flows_num = len(comp_eva_overview['main_flow_src_desc'].split('、'))
|
||||||
|
high_stop_turns_num = sum([len(item.split('/')) for item in eva_overview['high_stop_turn_ratio_desc'].split('、')])
|
||||||
|
comp_high_stop_turns_num = sum([len(item.split('/')) for item in comp_eva_overview['high_stop_turn_ratio_desc'].split('、')])
|
||||||
|
overview = {
|
||||||
|
'stop_times': eva_overview['stop_times'],
|
||||||
|
'comp_stop_times': comp_eva_overview['stop_times'],
|
||||||
|
'stop_times_color': calc_index_color(eva_overview['stop_times'], comp_eva_overview['stop_times'], 'stop_times'),
|
||||||
|
'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_color': calc_index_color(float(eva_overview['high_park_percent'].replace('%', '')), float(comp_eva_overview['high_park_percent'].replace('%', '')), 'high_park_percent'),
|
||||||
|
'imbalance_index': eva_overview['imbalance_index'],
|
||||||
|
'comp_imbalance_index': comp_eva_overview['imbalance_index'],
|
||||||
|
'imbalance_index_color': calc_index_color(eva_overview['imbalance_index'], comp_eva_overview['imbalance_index'], 'imbalance_index'),
|
||||||
|
'speed': eva_overview['speed'],
|
||||||
|
'comp_speed': comp_eva_overview['speed'],
|
||||||
|
'speed_color': calc_index_color(eva_overview['speed'], comp_eva_overview['speed'], 'speed'),
|
||||||
|
'move_speed': eva_overview['move_speed'],
|
||||||
|
'comp_move_speed': comp_eva_overview['move_speed'],
|
||||||
|
'move_speed_color': calc_index_color(eva_overview['move_speed'], comp_eva_overview['move_speed'], 'move_speed'),
|
||||||
|
'delay_time': eva_overview['delay_time'],
|
||||||
|
'comp_delay_time': comp_eva_overview['delay_time'],
|
||||||
|
'delay_time_color': calc_index_color(eva_overview['delay_time'], comp_eva_overview['delay_time'], 'delay_time'),
|
||||||
|
'park_time': eva_overview['park_time'],
|
||||||
|
'comp_park_time': comp_eva_overview['park_time'],
|
||||||
|
'park_time_color': calc_index_color(eva_overview['park_time'], comp_eva_overview['park_time'], 'park_time'),
|
||||||
|
'service_level': eva_overview['service_level'],
|
||||||
|
'comp_service_level': comp_eva_overview['service_level'],
|
||||||
|
'main_flow_nums': main_flows_num,
|
||||||
|
'comp_main_flow_nums': comp_main_flows_num,
|
||||||
|
'high_stop_turns_num': high_stop_turns_num,
|
||||||
|
'comp_high_stop_turns_num': comp_high_stop_turns_num
|
||||||
|
}
|
||||||
|
return overview
|
||||||
|
|
||||||
|
|
||||||
|
def calc_index_color(index, comp_index, key):
|
||||||
|
color = 0
|
||||||
|
if key not in ('speed', 'move_speed'):
|
||||||
|
rate = 0 if (comp_index in (0, '-') or index == '-') else round((index - comp_index) / comp_index * 100, 2)
|
||||||
|
if rate > 20:
|
||||||
|
color = 1
|
||||||
|
elif rate < -20:
|
||||||
|
color = 2
|
||||||
|
else:
|
||||||
|
rate = 0 if (comp_index in (0, '-') or index == '-') else round((index - comp_index) / comp_index * 100, 2)
|
||||||
|
if rate < -20:
|
||||||
|
color = 1
|
||||||
|
elif rate > 20:
|
||||||
|
color = 2
|
||||||
|
return color
|
||||||
|
|
||||||
|
|
||||||
|
def parse_comp_inroad_delay_infos(inroad_delay_infos, comp_inroad_delay_infos):
|
||||||
|
inroad_data_keys = inroad_delay_infos.keys()
|
||||||
|
comp_inroad_data_keys = comp_inroad_delay_infos.keys()
|
||||||
|
all_keys = inroad_data_keys | comp_inroad_data_keys
|
||||||
|
res = {}
|
||||||
|
for key in all_keys:
|
||||||
|
comp_data = {
|
||||||
|
'item': '优化前',
|
||||||
|
'service_level': comp_inroad_delay_infos[key]['service_level'] if key in comp_inroad_data_keys else '-',
|
||||||
|
'stop_times': comp_inroad_delay_infos[key]['stop_times'] if key in comp_inroad_data_keys else '-',
|
||||||
|
'high_park_percent': comp_inroad_delay_infos[key]['high_park_percent'] if key in comp_inroad_data_keys else '-',
|
||||||
|
'imbalance_index': comp_inroad_delay_infos[key]['imbalance_index'] if key in comp_inroad_data_keys else '-',
|
||||||
|
'park_time': comp_inroad_delay_infos[key]['park_time'] if key in comp_inroad_data_keys else '-',
|
||||||
|
'delay_time': comp_inroad_delay_infos[key]['delay_time'] if key in comp_inroad_data_keys else '-',
|
||||||
|
'speed': comp_inroad_delay_infos[key]['speed'] if key in comp_inroad_data_keys else '-',
|
||||||
|
'move_speed': comp_inroad_delay_infos[key]['move_speed'] if key in comp_inroad_data_keys else '-'
|
||||||
|
}
|
||||||
|
item_data = {
|
||||||
|
'item': '优化后',
|
||||||
|
'service_level': inroad_delay_infos[key]['service_level'] if key in inroad_data_keys else '-',
|
||||||
|
'stop_times': inroad_delay_infos[key]['stop_times'] if key in inroad_data_keys else '-',
|
||||||
|
'high_park_percent': inroad_delay_infos[key]['high_park_percent'] if key in inroad_data_keys else '-',
|
||||||
|
'imbalance_index': inroad_delay_infos[key]['imbalance_index'] if key in inroad_data_keys else '-',
|
||||||
|
'park_time': inroad_delay_infos[key]['park_time'] if key in inroad_data_keys else '-',
|
||||||
|
'delay_time': inroad_delay_infos[key]['delay_time'] if key in inroad_data_keys else '-',
|
||||||
|
'speed': inroad_delay_infos[key]['speed'] if key in inroad_data_keys else '-',
|
||||||
|
'move_speed': inroad_delay_infos[key]['move_speed'] if key in inroad_data_keys else '-'
|
||||||
|
}
|
||||||
|
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']),
|
||||||
|
'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['high_park_percent'] == '-' else round(float(item_data['high_park_percent'].replace('%', '')) - float(comp_data['high_park_percent'].replace('%', '')), 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'],
|
||||||
|
'delay_time': '-' if item_data['delay_time'] == '-' or comp_data['delay_time'] == '-' else item_data['delay_time'] - comp_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'),
|
||||||
|
'high_park_percent_color': '-' if item_data['high_park_percent'] == '-' or comp_data['high_park_percent'] == '-' else calc_index_color(float(item_data['high_park_percent'].replace('%', '')), float(comp_data['high_park_percent'].replace('%', '')), 'high_park_percent'),
|
||||||
|
'imbalance_index_color': '-' if item_data['imbalance_index'] == '-' or comp_data['imbalance_index'] == '-' else calc_index_color(item_data['imbalance_index'], comp_data['imbalance_index'], 'imbalance_index'),
|
||||||
|
'park_time_color': '-' if item_data['park_time'] == '-' or comp_data['park_time'] == '-' else calc_index_color(item_data['park_time'], comp_data['park_time'], 'park_time'),
|
||||||
|
'delay_time_color': '-' if item_data['delay_time'] == '-' or comp_data['delay_time'] == '-' else calc_index_color(item_data['delay_time'], comp_data['delay_time'], 'delay_time'),
|
||||||
|
'speed_color': '-' if item_data['speed'] == '-' or comp_data['speed'] == '-' else calc_index_color(item_data['speed'], comp_data['speed'], 'speed'),
|
||||||
|
'move_speed_color': '-' if item_data['move_speed'] == '-' or comp_data['move_speed'] == '-' else calc_index_color(item_data['move_speed'], comp_data['move_speed'], 'move_speed')
|
||||||
|
}
|
||||||
|
turn_type = inroad_delay_infos[key]['flow_delays'].keys()
|
||||||
|
comp_turn_type = comp_inroad_delay_infos[key]['flow_delays'].keys()
|
||||||
|
all_turn_type = turn_type | comp_turn_type
|
||||||
|
flow_delay_datas = {}
|
||||||
|
for item_turn in all_turn_type:
|
||||||
|
flow_comp_data = {
|
||||||
|
'item': '优化前',
|
||||||
|
'service_level': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['service_level'] if item_turn in comp_turn_type else '-',
|
||||||
|
'stop_times': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['stop_times'] if item_turn in comp_turn_type else '-',
|
||||||
|
'high_park_percent': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['high_park_percent'] if item_turn in comp_turn_type else '-',
|
||||||
|
'park_time': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['park_time'] if item_turn in comp_turn_type else '-',
|
||||||
|
'delay_time': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['delay_time'] if item_turn in comp_turn_type else '-',
|
||||||
|
'speed': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['speed'] if item_turn in comp_turn_type else '-',
|
||||||
|
'move_speed': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['move_speed'] if item_turn in comp_turn_type else '-'
|
||||||
|
}
|
||||||
|
flow_item_data = {
|
||||||
|
'item': '优化后',
|
||||||
|
'service_level': inroad_delay_infos[key]['flow_delays'][item_turn]['service_level'] if item_turn in turn_type else '-',
|
||||||
|
'stop_times': inroad_delay_infos[key]['flow_delays'][item_turn]['stop_times'] if item_turn in turn_type else '-',
|
||||||
|
'high_park_percent': inroad_delay_infos[key]['flow_delays'][item_turn]['high_park_percent'] if item_turn in turn_type else '-',
|
||||||
|
'park_time': inroad_delay_infos[key]['flow_delays'][item_turn]['park_time'] if item_turn in turn_type else '-',
|
||||||
|
'delay_time': inroad_delay_infos[key]['flow_delays'][item_turn]['delay_time'] if item_turn in turn_type else '-',
|
||||||
|
'speed': inroad_delay_infos[key]['flow_delays'][item_turn]['speed'] if item_turn in turn_type else '-',
|
||||||
|
'move_speed': inroad_delay_infos[key]['flow_delays'][item_turn]['move_speed'] if item_turn in turn_type else '-'
|
||||||
|
}
|
||||||
|
flow_diff_data = {
|
||||||
|
'item': '变化量',
|
||||||
|
'service_level': '-' if flow_comp_data['service_level'] == '-' or flow_item_data['service_level'] == '-' else compare_level(flow_comp_data['service_level'], flow_item_data['service_level']),
|
||||||
|
'stop_times': '-' if flow_comp_data['stop_times'] == '-' or flow_item_data['stop_times'] == '-' else round(flow_comp_data['stop_times'] - flow_item_data['stop_times'], 2),
|
||||||
|
'high_park_percent': '-' if flow_comp_data['high_park_percent'] == '-' or flow_item_data['high_park_percent'] == '-' else round(float(flow_comp_data['high_park_percent'].replace('%', '')) - float(flow_item_data['high_park_percent'].replace('%', '')), 2),
|
||||||
|
'park_time': '-' if flow_comp_data['park_time'] == '-' or flow_item_data['park_time'] == '-' else round(flow_comp_data['park_time'] - flow_item_data['park_time'], 2),
|
||||||
|
'delay_time': '-' if flow_comp_data['delay_time'] == '-' or flow_item_data['delay_time'] == '-' else round(flow_comp_data['delay_time'] - flow_item_data['delay_time'], 2),
|
||||||
|
'speed': '-' if flow_comp_data['speed'] == '-' or flow_item_data['speed'] == '-' else round(flow_comp_data['speed'] - flow_item_data['speed'], 2),
|
||||||
|
'move_speed': '-' if flow_comp_data['move_speed'] == '-' or flow_item_data['move_speed'] == '-' else round(flow_comp_data['move_speed'] - flow_item_data['move_speed'], 2),
|
||||||
|
'stop_times_color': '-' if flow_item_data['stop_times'] == '-' or flow_comp_data['stop_times'] == '-' else calc_index_color(flow_item_data['stop_times'], flow_comp_data['stop_times'], 'stop_times'),
|
||||||
|
'high_park_percent_color': '-' if flow_item_data['high_park_percent'] == '-' or flow_comp_data['high_park_percent'] == '-' else calc_index_color(float(flow_item_data['high_park_percent'].replace('%', '')), float(comp_data['high_park_percent'].replace('%', '')), 'high_park_percent'),
|
||||||
|
'park_time_color': '-' if flow_item_data['park_time'] == '-' or flow_comp_data['park_time'] == '-' else calc_index_color(flow_item_data['park_time'], flow_comp_data['park_time'], 'park_time'),
|
||||||
|
'delay_time_color': '-' if flow_item_data['delay_time'] == '-' or flow_comp_data['delay_time'] == '-' else calc_index_color(flow_item_data['delay_time'], flow_comp_data['delay_time'], 'delay_time'),
|
||||||
|
'speed_color': '-' if flow_item_data['speed'] == '-' or flow_comp_data['speed'] == '-' else calc_index_color(flow_item_data['speed'], flow_comp_data['speed'], 'speed'),
|
||||||
|
'move_speed_color': '-' if flow_item_data['move_speed'] == '-' or flow_comp_data['move_speed'] == '-' else calc_index_color(flow_item_data['move_speed'], flow_comp_data['move_speed'], 'move_speed')
|
||||||
|
}
|
||||||
|
flow_delay_datas[item_turn] = {
|
||||||
|
'item_data': flow_item_data,
|
||||||
|
'comp_data': flow_comp_data,
|
||||||
|
'diff_data': flow_diff_data
|
||||||
|
}
|
||||||
|
res[key] = {
|
||||||
|
'src_dir': inroad_delay_infos[key]['src_dir'] if 'src_dir' in inroad_delay_infos[key] else comp_inroad_delay_infos[key]['src_dir'],
|
||||||
|
'dir_data': {
|
||||||
|
'item_data': item_data,
|
||||||
|
'comp_data': comp_data,
|
||||||
|
'diff_data': diff_data,
|
||||||
|
'flow_delay_datas': flow_delay_datas
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
def compare_level(new, old):
|
||||||
|
if new == '-' or old == '-':
|
||||||
|
return 0
|
||||||
|
scores = {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5}
|
||||||
|
new_score, old_score = scores.get(new, 99), scores.get(old, 99)
|
||||||
|
if new_score == old_score:
|
||||||
|
return 0
|
||||||
|
return 2 if new_score < old_score else 1
|
||||||
|
|
||||||
|
|
||||||
|
def find_job_info(key, value_list):
|
||||||
|
result = []
|
||||||
|
# 遍历名字列表
|
||||||
|
for value in value_list:
|
||||||
|
# 检查是否完全匹配
|
||||||
|
if key in value['cross_name']:
|
||||||
|
result.append(value)
|
||||||
|
if key == value['cross_name']:
|
||||||
|
result = [value]
|
||||||
|
break
|
||||||
|
# 检查是否是首字母缩写匹配
|
||||||
|
elif len(key) >= 2 and len(value['cross_name']) >= 2:
|
||||||
|
# 将名字转换为拼音并提取首字母
|
||||||
|
first_pinyin = lazy_pinyin(value['cross_name'][0])[0]
|
||||||
|
second_pinyin = lazy_pinyin(value['cross_name'][1])[0]
|
||||||
|
if key[0].lower() == first_pinyin[0].lower() and key[1].lower() == second_pinyin[0].lower():
|
||||||
|
result.append(value)
|
||||||
|
# # 检查是否包含关键字
|
||||||
|
# elif key in value['wave_name']:
|
||||||
|
# result.append(value)
|
||||||
|
return result
|
||||||
|
|
@ -0,0 +1,409 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# @Author: Owl
|
||||||
|
# @Date: 2025/11/27 10:15
|
||||||
|
# @Description: 路口优化对比页面相关接口函数
|
||||||
|
|
||||||
|
from app.eva_common import *
|
||||||
|
from app.cross_compare_common import *
|
||||||
|
import proto.greenwave_type_pb2 as survey_pb
|
||||||
|
|
||||||
|
|
||||||
|
def query_compare_data(params):
|
||||||
|
"""
|
||||||
|
对比数据查询接口
|
||||||
|
:param data:
|
||||||
|
:return: json
|
||||||
|
"""
|
||||||
|
crossid = check_param(params, 'crossid')
|
||||||
|
if not crossid:
|
||||||
|
return json.dumps(make_common_res(1, '缺少crossid, 请刷新后重试'))
|
||||||
|
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异常,请检查后重试'))
|
||||||
|
date_list = check_param(params, 'date_list') # 优化后
|
||||||
|
if not date_list or len(date_list) < 1:
|
||||||
|
return json.dumps(make_common_res(7, '缺少日期参数,请最少选择一天作为查询日期'))
|
||||||
|
compare_date_list = check_param(params, 'compare_date_list') # 优化前
|
||||||
|
if not compare_date_list or len(compare_date_list) < 1:
|
||||||
|
return json.dumps(make_common_res(6, '缺少对比日期参数,请最少选择一天作为对比日期'))
|
||||||
|
query_type = check_param(params, 'query_type')
|
||||||
|
if not query_type:
|
||||||
|
query_type = 0
|
||||||
|
time_range = check_param(params, 'time_range')
|
||||||
|
if not time_range:
|
||||||
|
return json.dumps(make_common_res(8, '缺少时段范围,请选择时段范围'))
|
||||||
|
tp_start = int(str(time_range.split('-')[0]).split(':')[0]) * 100 + int(str(time_range.split('-')[0]).split(':')[1])
|
||||||
|
# tp_end = int(str(time_range.split('-')[1]).split(':')[0]) * 100 + int(str(time_range.split('-')[1]).split(':')[1])
|
||||||
|
# if tp_end == 0:
|
||||||
|
# tp_end = 2400
|
||||||
|
if query_type == 1:
|
||||||
|
tp_start = 't' + str(tp_start)
|
||||||
|
elif query_type == 2:
|
||||||
|
tp_start = 'h' + str(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)
|
||||||
|
if not avg_cross_delay_info:
|
||||||
|
return json.dumps(make_common_res(9, '当前所选日期范围内该评测时段无可用数据'))
|
||||||
|
comp_cross_delay_data_list = db_cross.query_cross_delay_info(crossid, nodeid, compare_date_list, tp_start)
|
||||||
|
avg_comp_cross_delay_info = gen_avg_cross_delay_pb(comp_cross_delay_data_list)
|
||||||
|
if not avg_comp_cross_delay_info:
|
||||||
|
return json.dumps(make_common_res(10, '当前所选对比日期范围内该评测时段无可用数据'))
|
||||||
|
cross_inroads = db_tmnet.query_cross_inroads(crossid, nodeid)
|
||||||
|
inroad_static_info_dict = {item['roadid']: item for item in cross_inroads}
|
||||||
|
# 路口静态信息及台账信息
|
||||||
|
cross_ledger_info_dict = query_cross_ledger_info(crossid, nodeid, area_id, userid)
|
||||||
|
if not cross_ledger_info_dict:
|
||||||
|
return json.dumps(make_common_res(10, '查询路口信息失败'))
|
||||||
|
cross_static_info, cross_ledger_info = gen_cross_static_info(crossid, nodeid, area_id, cross_ledger_info_dict)
|
||||||
|
roads_dir_dict = gen_road_dir_dict(cross_ledger_info)
|
||||||
|
# 路口指标数据概览
|
||||||
|
overview_res = gen_overview_index(avg_cross_delay_info, inroad_static_info_dict, nodeid, date_list, roads_dir_dict)
|
||||||
|
comp_overview_res = gen_overview_index(avg_comp_cross_delay_info, inroad_static_info_dict, nodeid, compare_date_list, roads_dir_dict)
|
||||||
|
final_overview = gen_compare_overview_res(overview_res, comp_overview_res)
|
||||||
|
# 路段及流向数据概览
|
||||||
|
road_flow_delay_infos = gen_road_delay_index(avg_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)
|
||||||
|
|
||||||
|
prev_cross_info = get_prev_cross(nodeid, area_id, roads_dir_dict)
|
||||||
|
res = make_common_res(0, 'ok')
|
||||||
|
res['data'] = {
|
||||||
|
'cross_static_info': cross_static_info,
|
||||||
|
'overview': final_overview,
|
||||||
|
'ledger_info': cross_ledger_info,
|
||||||
|
'next_cross_info': prev_cross_info,
|
||||||
|
'road_flow_delay_infos': compared_inroad_delay_infos
|
||||||
|
}
|
||||||
|
return json.dumps(res, ensure_ascii=False)
|
||||||
|
|
||||||
|
|
||||||
|
def do_add_cross_survey_job(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异常,请检查后重试'))
|
||||||
|
start_date = check_param(params, 'start_date')
|
||||||
|
if not start_date:
|
||||||
|
return json.dumps(make_common_res(6, '缺少开始日期,请选择开始日期'))
|
||||||
|
crossids = check_param(params, 'crossids')
|
||||||
|
if not crossids or len(crossids) < 1:
|
||||||
|
return json.dumps(make_common_res(7, '缺少路口id,请选择路口'))
|
||||||
|
|
||||||
|
fail_num, err_str, values = 0, '创建实景勘察任务失败的路口为:', []
|
||||||
|
for crossid in crossids:
|
||||||
|
existed_jobs_list = db_tmnet.query_cross_survey_job(crossid, area_id)
|
||||||
|
new_job_end_date = datetime.strptime(start_date, '%Y%m%d') + + timedelta(days=30)
|
||||||
|
bad_flag = False
|
||||||
|
cross_ledger_info_dict = query_cross_ledger_info(crossid, nodeid, area_id, userid)
|
||||||
|
if not cross_ledger_info_dict:
|
||||||
|
err_str += ",路口【%s】信息查询失败" % crossid
|
||||||
|
fail_num += 1
|
||||||
|
continue
|
||||||
|
cross_static_info, cross_ledger_info = gen_cross_static_info(crossid, nodeid, area_id, cross_ledger_info_dict)
|
||||||
|
roads_dir_dict = gen_road_dir_dict(cross_ledger_info)
|
||||||
|
for job in existed_jobs_list:
|
||||||
|
if job['status'] == 1:
|
||||||
|
err_str += ",路口【%s】已存在进行中任务" % g_roadnet.query_cross(crossid).name
|
||||||
|
bad_flag = True
|
||||||
|
continue
|
||||||
|
elif job['status'] == 0:
|
||||||
|
if datetime.strptime(str(job['start_day']), '%Y%m%d') < new_job_end_date < datetime.strptime(str(job['end_day']), '%Y%m%d')\
|
||||||
|
or datetime.strptime(str(job['start_day']), '%Y%m%d') < datetime.strptime(start_date, '%Y%m%d') < datetime.strptime(str(job['end_day']), '%Y%m%d'):
|
||||||
|
err_str += ",路口【%s】已存在未开始任务" % g_roadnet.query_cross(crossid).name
|
||||||
|
bad_flag = True
|
||||||
|
continue
|
||||||
|
if bad_flag:
|
||||||
|
fail_num += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
done_inroads = '|'.join([src_dir + ':0' for src_dir in roads_dir_dict.keys() if roads_dir_dict[src_dir]['in'] != '-'])
|
||||||
|
inroads_dir = '|'.join([src_dir + ':' + roads_dir_dict[src_dir]['in'] for src_dir in roads_dir_dict.keys() if roads_dir_dict[src_dir]['in'] != '-'])
|
||||||
|
values.append((crossid, start_date, new_job_end_date.strftime('%Y%m%d'), 0, done_inroads, inroads_dir, nodeid, area_id))
|
||||||
|
if len(values) > 0:
|
||||||
|
ret = db_tmnet.insert_cross_survey_job(values)
|
||||||
|
if ret == len(values):
|
||||||
|
res = make_common_res(0, 'ok')
|
||||||
|
else:
|
||||||
|
res = make_common_res(1, '创建任务失败')
|
||||||
|
res['data'] = {
|
||||||
|
'fail_num': fail_num,
|
||||||
|
'err_str': err_str if err_str != '创建实景勘察任务失败的路口为:' else '无'
|
||||||
|
}
|
||||||
|
return json.dumps(res)
|
||||||
|
else:
|
||||||
|
res = make_common_res(1, '创建任务失败')
|
||||||
|
res['data'] = {
|
||||||
|
'fail_num': fail_num,
|
||||||
|
'err_str': err_str if err_str != '创建实景勘察任务失败的路口为:' else '无'
|
||||||
|
}
|
||||||
|
return json.dumps(res)
|
||||||
|
|
||||||
|
|
||||||
|
def do_del_cross_survey_job(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异常,请检查后重试'))
|
||||||
|
jobid = check_param(params, 'jobid')
|
||||||
|
if not jobid:
|
||||||
|
return json.dumps(make_common_res(6, '缺少任务ID,请刷新后重试'))
|
||||||
|
job_info = db_tmnet.query_survey_job_info_by_id(jobid)
|
||||||
|
if not job_info:
|
||||||
|
return json.dumps(make_common_res(7, '任务不存在,请刷新后重试'))
|
||||||
|
if job_info[0]['status'] in [1, 2]:
|
||||||
|
return json.dumps(make_common_res(8, '任务正在执行中,请勿删除'))
|
||||||
|
ret = db_tmnet.del_cross_survey_job(jobid)
|
||||||
|
if ret == 1:
|
||||||
|
return json.dumps(make_common_res(0, 'ok'))
|
||||||
|
return json.dumps(make_common_res(9, '删除任务失败'))
|
||||||
|
|
||||||
|
|
||||||
|
def query_cross_survey_job_list(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异常,请检查后重试'))
|
||||||
|
keyword = check_param(params, 'keyword')
|
||||||
|
if not keyword:
|
||||||
|
keyword = ''
|
||||||
|
start_date = check_param(params, 'start_date')
|
||||||
|
if not start_date:
|
||||||
|
start_date = ''
|
||||||
|
end_date = check_param(params, 'end_date')
|
||||||
|
if not end_date:
|
||||||
|
end_date = ''
|
||||||
|
page = check_param(params, 'page')
|
||||||
|
if not page:
|
||||||
|
page = 1
|
||||||
|
page_size = check_param(params, 'page_size')
|
||||||
|
if not page_size:
|
||||||
|
page_size = 10
|
||||||
|
job_state = check_param(params, 'job_state')
|
||||||
|
if not job_state:
|
||||||
|
job_state = -1
|
||||||
|
start_index = (int(page) - 1) * int(page_size)
|
||||||
|
end_index = start_index + int(page_size)
|
||||||
|
job_list = db_tmnet.query_survey_job_info_by_area_id(area_id)
|
||||||
|
for row in job_list:
|
||||||
|
row['cross_name'] = g_roadnet.query_cross(row['cross_id']).name
|
||||||
|
complete_day = '-'
|
||||||
|
status = row['status']
|
||||||
|
if row['end_day'] < int(datetime.now().strftime('%Y%m%d')) and status != 2:
|
||||||
|
status = 3
|
||||||
|
if row['start_day'] > int(datetime.now().strftime('%Y%m%d')):
|
||||||
|
status = 0
|
||||||
|
if status == 2:
|
||||||
|
complete_day = row['update_time'].strftime('%Y%m%d')
|
||||||
|
row['status'] = status
|
||||||
|
row['complete_day'] = complete_day
|
||||||
|
row['update_time'] = row['update_time'].strftime('%Y%m%d')
|
||||||
|
|
||||||
|
if keyword and keyword != '':
|
||||||
|
job_list = find_job_info(job_list, keyword)
|
||||||
|
if start_date and start_date != '' and end_date and end_date != '':
|
||||||
|
job_list = list(filter(lambda item: str(item['end_day']) > str(end_date), job_list))
|
||||||
|
job_list = list(filter(lambda item: str(item['start_day']) < str(start_date), job_list))
|
||||||
|
if job_state and job_state != -1:
|
||||||
|
job_list = list(filter(lambda item: item['status'] == job_state, job_list))
|
||||||
|
job_list = sorted(job_list, key=lambda item: item['update_time'], reverse=True)
|
||||||
|
total_num = len(job_list)
|
||||||
|
job_list = job_list[start_index:end_index]
|
||||||
|
res = make_common_res(0, 'ok')
|
||||||
|
res['data'] = {
|
||||||
|
'total_num': total_num,
|
||||||
|
'job_list': job_list
|
||||||
|
}
|
||||||
|
return json.dumps(res)
|
||||||
|
|
||||||
|
|
||||||
|
def rerun_cross_survey_job(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异常,请检查后重试'))
|
||||||
|
jobid = check_param(params, 'jobid')
|
||||||
|
if not jobid:
|
||||||
|
return json.dumps(make_common_res(6, '缺少任务ID,请刷新后重试'))
|
||||||
|
job_info = db_tmnet.query_survey_job_info_by_id(jobid)
|
||||||
|
if not job_info:
|
||||||
|
return json.dumps(make_common_res(7, '任务不存在,请刷新后重试'))
|
||||||
|
if job_info[0]['status'] in [1, 2]:
|
||||||
|
return json.dumps(make_common_res(8, '任务正在执行中,无法执行重跑操作'))
|
||||||
|
|
||||||
|
ret = db_tmnet.update_cross_survey_job_status(job_info, jobid)
|
||||||
|
if ret == 1:
|
||||||
|
return json.dumps(make_common_res(0, 'ok'))
|
||||||
|
return json.dumps(make_common_res(9, '重跑任务失败'))
|
||||||
|
|
||||||
|
|
||||||
|
def query_cross_survey_usable_dates(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, '缺少crossid, 请刷新后重试'))
|
||||||
|
|
||||||
|
usable_info = {
|
||||||
|
'crossid': crossid,
|
||||||
|
'job_info': []
|
||||||
|
}
|
||||||
|
existed_jobs_list = db_tmnet.query_cross_survey_job(crossid, area_id)
|
||||||
|
for row in existed_jobs_list:
|
||||||
|
start_day = row['start_day']
|
||||||
|
end_day = '至今'
|
||||||
|
if row['status'] == 2:
|
||||||
|
# 判定当前任务状态值,如果当前任务状态为2 则任务可查询时间区间的极大值取当前日期和任务完成时间(即最新的update_time)的较小值
|
||||||
|
end_day = row['update_time'].strftime('%Y%m%d')
|
||||||
|
usable_info['job_info'].append({
|
||||||
|
'jobid': row['id'],
|
||||||
|
'time_range': start_day + '-' + end_day,
|
||||||
|
})
|
||||||
|
res = make_common_res(0, 'ok')
|
||||||
|
res['data'] = usable_info
|
||||||
|
return json.dumps(res)
|
||||||
|
|
||||||
|
|
||||||
|
def query_cross_survey_result(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,请刷新后重试'))
|
||||||
|
jobid = check_param(params, 'jobid')
|
||||||
|
if not jobid:
|
||||||
|
return json.dumps(make_common_res(7, '缺少任务id,请刷新后重试'))
|
||||||
|
|
||||||
|
job_info = db_tmnet.query_survey_job_info_by_id(jobid)
|
||||||
|
done_inroads = job_info[0]['done_inroads']
|
||||||
|
done_inroads_list = done_inroads.split('|')
|
||||||
|
done_src_dir_list = []
|
||||||
|
for item in done_inroads_list:
|
||||||
|
if item.split(':')[1] == '2':
|
||||||
|
done_src_dir_list.append(item.split(':')[0])
|
||||||
|
# 路口静态信息及台账信息
|
||||||
|
cross_ledger_info_dict = query_cross_ledger_info(crossid, nodeid, area_id, userid)
|
||||||
|
if not cross_ledger_info_dict:
|
||||||
|
return json.dumps(make_common_res(10, '查询路口信息失败'))
|
||||||
|
cross_static_info, cross_ledger_info = gen_cross_static_info(crossid, nodeid, area_id, cross_ledger_info_dict)
|
||||||
|
roads_dir_dict = gen_road_dir_dict(cross_ledger_info)
|
||||||
|
road_src_dict = {v['in']: k for k, v in roads_dir_dict.items()}
|
||||||
|
src_images = {}
|
||||||
|
for item in done_src_dir_list:
|
||||||
|
item_key = 'csr_' + crossid + '_' + str(jobid) + '_' + item
|
||||||
|
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.speed
|
||||||
|
image_time = datetime.fromtimestamp(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_list.append({
|
||||||
|
'src_dir': srcDir_toStr(src_dir) + '进口',
|
||||||
|
'speed': speed,
|
||||||
|
'image_time': image_time,
|
||||||
|
'image_url': image_url,
|
||||||
|
'image_location': image_location,
|
||||||
|
'dist': dist
|
||||||
|
})
|
||||||
|
src_images[src_dir] = image_list
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -425,7 +425,7 @@ class TmnetDbHelper(TableDbHelperBase):
|
||||||
|
|
||||||
def insert_cross_survey_job(self, values):
|
def insert_cross_survey_job(self, values):
|
||||||
sql = """
|
sql = """
|
||||||
insert into cross_survey.cross_survey_jobs (crossid, start_day, end_day, status, done_inroads, nodeid, area_id) values('%s', %s, %s, %s, '%s', %s, %s)
|
insert into cross_survey.cross_survey_jobs (crossid, start_day, end_day, status, done_inroads, inroads_dir, nodeid, area_id) values('%s', %s, %s, %s, '%s', '%s', %s, %s)
|
||||||
"""
|
"""
|
||||||
return self.do_executemany(sql, values)
|
return self.do_executemany(sql, values)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,10 @@ message xl_road_traj_brief_t
|
||||||
uint32 pass_timestamp = 16; // 过灯时刻
|
uint32 pass_timestamp = 16; // 过灯时刻
|
||||||
int32 color = 17; // 过灯时的灯色,取值含义为: 3:红灯; 5:绿灯; 7:黄灯. 0值表示无信息.
|
int32 color = 17; // 过灯时的灯色,取值含义为: 3:红灯; 5:绿灯; 7:黄灯. 0值表示无信息.
|
||||||
int32 remain = 18; // 过灯时的灯色剩余的秒数
|
int32 remain = 18; // 过灯时的灯色剩余的秒数
|
||||||
|
|
||||||
|
// 针对灯后轨迹段的特殊字段
|
||||||
|
bool is_after_light = 19; // 是否为灯后轨迹段
|
||||||
|
uint64 xlinkid_after_light = 20; // 灯后的第一个link的xlinkid
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @brief 行驶段指标
|
/// @brief 行驶段指标
|
||||||
|
|
@ -501,6 +505,8 @@ message xl_cross_survey_result_t
|
||||||
int32 daynum = 3; // 勘查完成的日期
|
int32 daynum = 3; // 勘查完成的日期
|
||||||
string orderid = 4; // 订单ID
|
string orderid = 4; // 订单ID
|
||||||
repeated xl_survey_pos_t pos_list = 5; // 一系列位置点的图片信息
|
repeated xl_survey_pos_t pos_list = 5; // 一系列位置点的图片信息
|
||||||
|
string inroadid = 6; // 进口道的id
|
||||||
|
string outroadid = 7; // 出口道的id, 预留扩展。两个roadid只能给其中一个赋值。
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue