修复部分巡查bug

This commit is contained in:
wangxu 2025-11-03 15:52:58 +08:00
parent fcb6fd6117
commit 5dcba9822f
2 changed files with 68 additions and 40 deletions

View File

@ -265,7 +265,7 @@ def query_cross_index_trend_controller(params):
roads_dir_dict = gen_road_dir_dict(cross_ledger_info) roads_dir_dict = gen_road_dir_dict(cross_ledger_info)
# 查询前一天的小时级别数据 # 查询前一天的小时级别数据
hours_data = db_cross.query_cross_delay_whole_day_hours(crossid, nodeid, prev_date) hours_data = db_cross.query_cross_delay_whole_day_hours(crossid, nodeid, query_date)
hour_pb_list = parse_data2pb(hours_data) hour_pb_list = parse_data2pb(hours_data)
hours_data_dict = parse_single_cross_delay_info(crossid, nodeid, hour_pb_list, 'hour', roads_dir_dict) hours_data_dict = parse_single_cross_delay_info(crossid, nodeid, hour_pb_list, 'hour', roads_dir_dict)
hours_data_with_change_rate = calc_single_day_delay_info_change_rate(hours_data_dict) hours_data_with_change_rate = calc_single_day_delay_info_change_rate(hours_data_dict)

View File

@ -179,10 +179,11 @@ def gen_avg_cross_delay_pb(cross_delay_data_list):
for flow_delay_info in flow_delay_list: for flow_delay_info in flow_delay_list:
xlink_id = flow_delay_info.xlink_id xlink_id = flow_delay_info.xlink_id
turn_type = flow_delay_info.turn_type turn_type = flow_delay_info.turn_type
if xlink_id not in flow_delay_info_dict: key = str(xlink_id) + '-' + str(turn_type)
flow_delay_info_dict[str(xlink_id) + '-' + str(turn_type)] = [flow_delay_info] if key not in flow_delay_info_dict:
flow_delay_info_dict[key] = [flow_delay_info]
else: else:
flow_delay_info_dict[str(xlink_id) + '-' + str(turn_type)].append(flow_delay_info) flow_delay_info_dict[key].append(flow_delay_info)
for key in flow_delay_info_dict.keys(): for key in flow_delay_info_dict.keys():
flow_delay_infos = flow_delay_info_dict[key] flow_delay_infos = flow_delay_info_dict[key]
inroadid = flow_delay_infos[0].inroadid inroadid = flow_delay_infos[0].inroadid
@ -514,7 +515,7 @@ def calc_inroad_imbalance_index(inroad_delay_pb_list):
for item in tmp_list: for item in tmp_list:
max_stop_times, min_stop_times = 0, 99999 max_stop_times, min_stop_times = 0, 99999
flow_delay_infos = item.flow_delay_infos flow_delay_infos = item.flow_delay_infos
avg_stop_times = sum(flow_delay_info.delay_info.stop_times for flow_delay_info in flow_delay_infos) / len(flow_delay_infos) avg_stop_times = sum(flow_delay_info.delay_info.stop_times for flow_delay_info in flow_delay_infos) / len(flow_delay_infos) if len(flow_delay_infos) > 0 else 0
for flow_delay_info in flow_delay_infos: for flow_delay_info in flow_delay_infos:
if flow_delay_info.delay_info.stop_times > max_stop_times: if flow_delay_info.delay_info.stop_times > max_stop_times:
max_stop_times = flow_delay_info.delay_info.stop_times max_stop_times = flow_delay_info.delay_info.stop_times
@ -721,7 +722,7 @@ def parse_single_cross_delay_info(crossid, nodeid, data_list, data_type, roads_d
cross_car_num = item_cross_delay_info.delay_info.car_num cross_car_num = item_cross_delay_info.delay_info.car_num
road_delay_infos = item_cross_delay_info.inroad_delay_infos road_delay_infos = item_cross_delay_info.inroad_delay_infos
if data_type != 'week': if data_type != 'week':
cross_imbalance_index = item_cross_delay_info.delay_info.imbalance_index cross_imbalance_index = round(item_cross_delay_info.delay_info.imbalance_index, 2)
else: else:
max_stop_times = max(road_delay_infos, key=lambda x: x.delay_info.stop_times).delay_info.stop_times max_stop_times = max(road_delay_infos, key=lambda x: x.delay_info.stop_times).delay_info.stop_times
min_stop_times = min(road_delay_infos, key=lambda x: x.delay_info.stop_times).delay_info.stop_times min_stop_times = min(road_delay_infos, key=lambda x: x.delay_info.stop_times).delay_info.stop_times
@ -903,15 +904,15 @@ def calc_roads_data_change_rate(roads_data, prev_roads_data):
if i in (0, 1, 2, 3, 6, 7): if i in (0, 1, 2, 3, 6, 7):
rate = (flow_data[i] - prev_flow_data[i]) / prev_flow_data[i] * 100 if prev_flow_data[i] > 0 else 0 rate = (flow_data[i] - prev_flow_data[i]) / prev_flow_data[i] * 100 if prev_flow_data[i] > 0 else 0
if rate < -20: if rate < -20:
flow_data[i + 9] = 1
elif rate > 20:
flow_data[i + 9] = 2 flow_data[i + 9] = 2
elif rate > 20:
flow_data[i + 9] = 1
else: else:
rate = (flow_data[i] - prev_flow_data[i]) / prev_flow_data[i] * 100 if prev_flow_data[i] > 0 else 0 rate = (flow_data[i] - prev_flow_data[i]) / prev_flow_data[i] * 100 if prev_flow_data[i] > 0 else 0
if rate > 20: if rate > 20:
flow_data[i + 9] = 1
elif rate < -20:
flow_data[i + 9] = 2 flow_data[i + 9] = 2
elif rate < -20:
flow_data[i + 9] = 1
return res_data return res_data
@ -955,27 +956,32 @@ def gen_operating_efficiency_problems(avg_cross_delay_info, roads_dir_dict, cros
'item': '运行效率', 'item': '运行效率',
'values': [] 'values': []
}] }]
operating_efficiency_problems = {
'item': '运行效率',
'values': [],
'total_num': 0
}
road_delay_infos = avg_cross_delay_info.inroad_delay_infos road_delay_infos = avg_cross_delay_info.inroad_delay_infos
high_park_problems, high_park_suggestions, high_park_total_num = gen_high_park_problems(road_delay_infos, roads_dir_dict, cross_phase) high_park_problems, high_park_suggestions, high_park_total_num = gen_high_park_problems(road_delay_infos, roads_dir_dict, cross_phase)
high_stop_times_problems, high_stop_times_suggestions, high_stop_times_total_num = gen_high_stop_time_problems(avg_cross_delay_info, is_peak) high_stop_times_problems, high_stop_times_suggestions, high_stop_times_total_num = gen_high_stop_time_problems(avg_cross_delay_info, is_peak)
operating_efficiency_problems = { sum_num = 0
'item': '运行效率', if high_park_total_num > 0:
'values': [ sum_num += high_park_total_num
{ operating_efficiency_problems['values'].append({
'item': '多次排队', 'item': '多次排队',
'detail': high_park_problems, 'detail': high_park_problems,
'reason': '某一进口道转向的多次停车率大于15%', 'reason': '某一进口道转向的多次停车率大于15%',
'suggestions': high_park_suggestions 'suggestions': high_park_suggestions
}, })
{ if high_stop_times_total_num > 0:
'item': '停车较多', sum_num += high_stop_times_total_num
'detail': high_stop_times_problems, operating_efficiency_problems['values'].append({
'reason': '高峰时段路口停车次数大于2次非高峰时段停车次数大于1次', 'item': '停车较多',
'suggestions': high_stop_times_suggestions 'detail': high_stop_times_problems,
} 'reason': '高峰时段路口停车次数大于2次非高峰时段停车次数大于1次',
], 'suggestions': high_stop_times_suggestions
'total_num': high_park_total_num + high_stop_times_total_num })
} operating_efficiency_problems['total_num'] = sum_num
return operating_efficiency_problems return operating_efficiency_problems
@ -1081,28 +1087,41 @@ def gen_balanced_control_problems(crossid, nodeid, date_list, avg_cross_delay_in
cross_tide_problems, cross_tide_suggestions, cross_tide_total_num = gen_cross_tide_problems(crossid, nodeid, date_list, roads_dir_dict) cross_tide_problems, cross_tide_suggestions, cross_tide_total_num = gen_cross_tide_problems(crossid, nodeid, date_list, roads_dir_dict)
balanced_control_problems = { balanced_control_problems = {
'item': '均衡调控', 'item': '均衡调控',
'values': [ 'values': [],
'total_num': 0
}
sum_num = 0
if cross_imbalance_total_num > 0:
sum_num += cross_imbalance_total_num
balanced_control_problems['values'].append(
{ {
'item': '路口失衡', 'item': '路口失衡',
'detail': cross_imbalance_detail, 'detail': cross_imbalance_detail,
'reason': '路口存在某个流向绿灯时长不足而另一个方向绿灯存在空放的现象', 'reason': '路口存在某个流向绿灯时长不足而另一个方向绿灯存在空放的现象',
'suggestions': cross_imbalance_suggestions 'suggestions': cross_imbalance_suggestions
}, }
)
if turn_imbalance_total_num > 0:
sum_num += turn_imbalance_total_num
balanced_control_problems['values'].append(
{ {
'item': '转向失衡', 'item': '转向失衡',
'detail': turn_imbalance_detail, 'detail': turn_imbalance_detail,
'reason': '同一进口道直行与左转停车次数之差的绝对值大于0.5且转向停车次数的最大值大于1', 'reason': '同一进口道直行与左转停车次数之差的绝对值大于0.5且转向停车次数的最大值大于1',
'suggestions': turn_imbalance_suggestions 'suggestions': turn_imbalance_suggestions
}, }
)
if cross_tide_total_num > 0:
sum_num += cross_tide_total_num
balanced_control_problems['values'].append(
{ {
'item': '路口潮汐', 'item': '路口潮汐',
'detail': cross_tide_problems, 'detail': cross_tide_problems,
'reason': '对向进口道早高峰其中一个方向的进口道与出口道流量比大于150%晚高峰另一个方向进口道与出口道流量比大于150%', 'reason': '对向进口道早高峰其中一个方向的进口道与出口道流量比大于150%晚高峰另一个方向进口道与出口道流量比大于150%',
'suggestions': cross_tide_suggestions 'suggestions': cross_tide_suggestions
} }
], )
'total_num': cross_imbalance_total_num + turn_imbalance_total_num + cross_tide_total_num balanced_control_problems['total_num'] = sum_num
}
return balanced_control_problems return balanced_control_problems
@ -1423,22 +1442,31 @@ def gen_cross_channelized_problems(avg_cross_delay_info, roads_dir_dict, inroad_
inout_lane_num_gap_problems, inout_lane_num_gap_suggestions, inout_lane_num_gap_total_num = gen_in_out_lane_num_gap_problems(cross_ledger_info) inout_lane_num_gap_problems, inout_lane_num_gap_suggestions, inout_lane_num_gap_total_num = gen_in_out_lane_num_gap_problems(cross_ledger_info)
cross_channelized_problems = { cross_channelized_problems = {
'item': '路口渠化', 'item': '路口渠化',
'values': [ 'values': [],
'total_num': 0
}
sum_num = 0
if inroad_num_err_total_num > 0:
sum_num += inroad_num_err_total_num
cross_channelized_problems['values'].append(
{ {
'item': '车道资源不匹配', 'item': '车道资源不匹配',
'detail': inroad_num_detail, 'detail': inroad_num_detail,
'reason': '同一进口道直行或左转的流量占比大于50%且相对流量占比大于60%且车道数量占比小于流量占比的一半多方向放行车道每个方向各算0.5', 'reason': '同一进口道直行或左转的流量占比大于50%且相对流量占比大于60%且车道数量占比小于流量占比的一半多方向放行车道每个方向各算0.5',
'suggestions': inroad_num_suggestion 'suggestions': inroad_num_suggestion
}, }
)
if inout_lane_num_gap_total_num > 0:
sum_num += inout_lane_num_gap_total_num
cross_channelized_problems['values'].append(
{ {
'item': '进出口车道数不匹配', 'item': '进出口车道数不匹配',
'detail': inout_lane_num_gap_problems, 'detail': inout_lane_num_gap_problems,
'reason': '进口道车道数比对向的出口道车道数多2', 'reason': '进口道车道数比对向的出口道车道数多2',
'suggestions': inout_lane_num_gap_suggestions 'suggestions': inout_lane_num_gap_suggestions
}, }
], )
'total_num': inroad_num_err_total_num + inout_lane_num_gap_total_num cross_channelized_problems['total_num'] = sum_num
}
return cross_channelized_problems return cross_channelized_problems