提交部分对比相关接口内容

This commit is contained in:
wangxu 2025-12-01 17:49:20 +08:00
parent 69f7fc30cc
commit a10a0bdd07
6 changed files with 747 additions and 97 deletions

33
app/compare_views.py Normal file
View File

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

202
app/cross_compare_common.py Normal file
View File

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

409
app/cross_compare_worker.py Normal file
View File

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

View File

@ -425,7 +425,7 @@ class TmnetDbHelper(TableDbHelperBase):
def insert_cross_survey_job(self, values):
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)

View File

@ -42,6 +42,10 @@ message xl_road_traj_brief_t
uint32 pass_timestamp = 16; //
int32 color = 17; // ,: 3:; 5:绿; 7:. 0.
int32 remain = 18; //
//
bool is_after_light = 19; //
uint64 xlinkid_after_light = 20; // link的xlinkid
};
/// @brief
@ -501,6 +505,8 @@ message xl_cross_survey_result_t
int32 daynum = 3; //
string orderid = 4; // ID
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