2025-12-01 17:49:20 +08:00
# -*- 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 ( ' 、 ' ) ] )
2025-12-11 14:51:01 +08:00
comp_high_stop_turns_num = sum ( [ len ( item . split ( ' / ' ) ) for item in comp_eva_overview [ ' high_stop_turn_ratio_desc ' ] . split ( ' 、 ' ) ] )
2025-12-01 17:49:20 +08:00
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 ' ) ,
2025-12-11 14:51:01 +08:00
' 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 ' ) ,
2025-12-01 17:49:20 +08:00
' imbalance_index ' : eva_overview [ ' imbalance_index ' ] ,
' comp_imbalance_index ' : comp_eva_overview [ ' imbalance_index ' ] ,
2025-12-11 14:51:01 +08:00
' imbalance_index_color ' : calc_index_color ( eva_overview [ ' imbalance_index ' ] , comp_eva_overview [ ' imbalance_index ' ] , ' imbalance_index ' ) ,
2025-12-01 17:49:20 +08:00
' 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 ' - ' ,
2025-12-11 15:15:29 +08:00
' high_park_percent ' : comp_inroad_delay_infos [ key ] [ ' high_park_percent ' ] if key in comp_inroad_data_keys else ' - ' ,
2025-12-01 17:49:20 +08:00
' 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 ' - ' ,
2025-12-11 15:15:29 +08:00
' high_park_percent ' : inroad_delay_infos [ key ] [ ' high_park_percent ' ] if key in inroad_data_keys else ' - ' ,
2025-12-01 17:49:20 +08:00
' 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 ' : ' 变化量 ' ,
2025-12-10 18:20:44 +08:00
' service_level ' : ' - ' if item_data [ ' service_level ' ] == ' - ' or comp_data [ ' 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 ) ,
2025-12-11 15:15:29 +08:00
' high_park_percent ' : ' - ' if ' - ' in item_data [ ' high_park_percent ' ] or ' - ' in comp_data [ ' high_park_percent ' ] else str ( int ( float ( item_data [ ' high_park_percent ' ] . replace ( ' % ' , ' ' ) ) - float ( comp_data [ ' high_park_percent ' ] . replace ( ' % ' , ' ' ) ) ) ) + ' % ' ,
2025-12-10 18:20:44 +08:00
' 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 ' ) ,
2025-12-11 15:03:53 +08:00
' high_park_percent_color ' : ' - ' if ' - ' in item_data [ ' high_park_percent ' ] or ' - ' in 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 ' ) ,
2025-12-10 18:20:44 +08:00
' 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 ' )
2025-12-01 17:49:20 +08:00
}
2025-12-10 18:20:44 +08:00
turn_type = inroad_delay_infos [ key ] [ ' flow_delays ' ] . keys ( ) if key in inroad_delay_infos . keys ( ) else set ( )
comp_turn_type = comp_inroad_delay_infos [ key ] [ ' flow_delays ' ] . keys ( ) if key in comp_inroad_delay_infos . keys ( ) else set ( )
2025-12-01 17:49:20 +08:00
all_turn_type = turn_type | comp_turn_type
flow_delay_datas = { }
for item_turn in all_turn_type :
flow_comp_data = {
' item ' : ' 优化前 ' ,
2025-12-10 18:20:44 +08:00
' service_level ' : comp_inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' service_level ' ] if key in comp_inroad_delay_infos . keys ( ) and item_turn in comp_turn_type else ' - ' ,
' stop_times ' : comp_inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' stop_times ' ] if key in comp_inroad_delay_infos . keys ( ) and item_turn in comp_turn_type else ' - ' ,
2025-12-11 15:15:29 +08:00
' high_park_percent ' : comp_inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' high_park_percent ' ] if key in comp_inroad_delay_infos . keys ( ) and item_turn in comp_turn_type else ' - ' ,
2025-12-10 18:20:44 +08:00
' park_time ' : comp_inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' park_time ' ] if key in comp_inroad_delay_infos . keys ( ) and item_turn in comp_turn_type else ' - ' ,
' delay_time ' : comp_inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' delay_time ' ] if key in comp_inroad_delay_infos . keys ( ) and item_turn in comp_turn_type else ' - ' ,
' speed ' : comp_inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' speed ' ] if key in comp_inroad_delay_infos . keys ( ) and item_turn in comp_turn_type else ' - ' ,
' move_speed ' : comp_inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' move_speed ' ] if key in comp_inroad_delay_infos . keys ( ) and item_turn in comp_turn_type else ' - '
2025-12-01 17:49:20 +08:00
}
flow_item_data = {
' item ' : ' 优化后 ' ,
2025-12-10 18:20:44 +08:00
' service_level ' : inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' service_level ' ] if key in inroad_delay_infos . keys ( ) and item_turn in turn_type else ' - ' ,
' stop_times ' : inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' stop_times ' ] if key in inroad_delay_infos . keys ( ) and item_turn in turn_type else ' - ' ,
2025-12-11 15:15:29 +08:00
' high_park_percent ' : inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' high_park_percent ' ] if key in inroad_delay_infos . keys ( ) and item_turn in turn_type else ' - ' ,
2025-12-10 18:20:44 +08:00
' park_time ' : inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' park_time ' ] if key in inroad_delay_infos . keys ( ) and item_turn in turn_type else ' - ' ,
' delay_time ' : inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' delay_time ' ] if key in inroad_delay_infos . keys ( ) and item_turn in turn_type else ' - ' ,
' speed ' : inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' speed ' ] if key in inroad_delay_infos . keys ( ) and item_turn in turn_type else ' - ' ,
' move_speed ' : inroad_delay_infos [ key ] [ ' flow_delays ' ] [ item_turn ] [ ' move_speed ' ] if key in inroad_delay_infos . keys ( ) and item_turn in turn_type else ' - '
2025-12-01 17:49:20 +08:00
}
flow_diff_data = {
' item ' : ' 变化量 ' ,
2025-12-10 18:20:44 +08:00
' 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 ) ,
2025-12-11 15:15:29 +08:00
' high_park_percent ' : ' - ' if ' - ' in flow_comp_data [ ' high_park_percent ' ] or ' - ' in flow_item_data [ ' high_park_percent ' ] else str ( int ( float ( flow_comp_data [ ' high_park_percent ' ] . replace ( ' % ' , ' ' ) ) - float ( flow_item_data [ ' high_park_percent ' ] . replace ( ' % ' , ' ' ) ) ) ) + ' % ' ,
2025-12-10 18:20:44 +08:00
' 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 ' ) ,
2025-12-11 15:15:29 +08:00
' high_park_percent_color ' : ' - ' if ' - ' in flow_item_data [ ' high_park_percent ' ] or ' - ' in flow_comp_data [ ' high_park_percent ' ] else calc_index_color ( float ( flow_item_data [ ' high_park_percent ' ] . replace ( ' % ' , ' ' ) ) , float ( flow_comp_data [ ' high_park_percent ' ] . replace ( ' % ' , ' ' ) ) , ' high_park_percent ' ) ,
2025-12-10 18:20:44 +08:00
' 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 ' )
2025-12-01 17:49:20 +08:00
}
flow_delay_datas [ item_turn ] = {
' item_data ' : flow_item_data ,
' comp_data ' : flow_comp_data ,
' diff_data ' : flow_diff_data
}
res [ key ] = {
2025-12-11 15:15:29 +08:00
' src_dir ' : inroad_delay_infos [ key ] [ ' src_dir ' ] if key in inroad_delay_infos . keys ( ) and ' src_dir ' in inroad_delay_infos [ key ] else comp_inroad_delay_infos [ key ] [ ' src_dir ' ] ,
2025-12-01 17:49:20 +08:00
' dir_data ' : {
' item_data ' : item_data ,
' comp_data ' : comp_data ,
' diff_data ' : diff_data ,
' flow_delay_datas ' : flow_delay_datas
}
}
2025-12-10 09:49:37 +08:00
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
2025-12-01 17:49:20 +08:00
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)
2025-12-03 18:19:02 +08:00
return result
2025-12-04 16:04:38 +08:00
def query_compare_data_export_excel ( compared_inroad_delay_infos , cross_name , compare_date_list , date_list , time_range ) :
2025-12-03 18:19:02 +08:00
wb = Workbook ( )
sheet1 = wb . active
sheet1 . title = " 调度计划表 " # 给第一个 sheet 命名
table_head = [
{ " range " : " A1:A2 " , " value " : " 路口名称 " } ,
{ " range " : " B1:B2 " , " value " : " 进口道 " } ,
{ " range " : " C1:C2 " , " value " : " 对比 " } ,
{ " range " : " D1:D2 " , " value " : " 服务水平 " } ,
{ " range " : " E1:F1 " , " value " : " 转向服务水平 " } ,
{ " range " : " E2 " , " value " : " 左转 " , " width " : 10 } ,
{ " range " : " F2 " , " value " : " 直行 " , " width " : 10 } ,
{ " range " : " G1:G2 " , " value " : " 停车次数 " } ,
{ " range " : " H1:I1 " , " value " : " 转向停车次数 " } ,
{ " range " : " H2 " , " value " : " 左转 " } ,
{ " range " : " I2 " , " value " : " 直行 " } ,
2025-12-04 16:04:38 +08:00
{ " range " : " J1:J2 " , " value " : " 多次停车率 " , " width " : 20 } ,
{ " range " : " K1:L1 " , " value " : " 转向多次停车率 " } ,
{ " range " : " K2 " , " value " : " 左转 " , " width " : 10 } ,
{ " range " : " L2 " , " value " : " 直行 " , " width " : 10 } ,
# {"range": "M1:M2", "value": "行程时间(s)", "width": 20},
# {"range": "N1:O1", "value": "转向行程时间(s)"},
# {"range": "N2", "value": "左转", "width": 10},
# {"range": "O2", "value": "直行", "width": 10},
{ " range " : " M1:M2 " , " value " : " 延误时间(s) " , " width " : 20 } ,
{ " range " : " N1:O1 " , " value " : " 转向延误时间(s) " } ,
{ " range " : " N2 " , " value " : " 左转 " , " width " : 10 } ,
{ " range " : " O2 " , " value " : " 直行 " , " width " : 10 } ,
{ " range " : " P1:P2 " , " value " : " 平均速度(Km/h) " , " width " : 20 } ,
{ " range " : " Q1:R1 " , " value " : " 转向平均速度(Km/h) " } ,
{ " range " : " Q2 " , " value " : " 左转 " , " width " : 10 } ,
{ " range " : " R2 " , " value " : " 直行 " , " width " : 10 } ,
{ " range " : " S1:S2 " , " value " : " 不停车速度(Km/h) " , " width " : 20 } ,
{ " range " : " T1:U1 " , " value " : " 转向不停车速度(KM/h) " } ,
{ " range " : " T2 " , " value " : " 左转 " , " width " : 15 } ,
{ " range " : " U2 " , " value " : " 直行 " , " width " : 15 } ,
{ " range " : " V1:V2 " , " value " : " 转向失衡系数 " , " width " : 20 } ,
2025-12-03 18:19:02 +08:00
]
for item_head in table_head :
sheet1 . merge_cells ( item_head [ ' range ' ] )
cell = item_head [ ' range ' ] . split ( " : " ) [ 0 ]
sheet1 [ cell ] = item_head [ ' value ' ]
sheet1 [ cell ] . alignment = Alignment ( horizontal = ' center ' , vertical = ' center ' )
if item_head . get ( ' width ' ) :
sheet1 . column_dimensions [ cell [ : - 1 ] ] . width = item_head [ ' width ' ]
2025-12-04 16:04:38 +08:00
in_road_num = len ( compared_inroad_delay_infos )
sheet1 . merge_cells ( f " A3:A { in_road_num * 3 + 2 } " )
sheet1 [ " A3 " ] = cross_name
sheet1 [ " A3 " ] . alignment = Alignment ( horizontal = ' center ' , vertical = ' center ' , wrap_text = True )
index = 3
for road , road_value in compared_inroad_delay_infos . items ( ) :
start_row = index
middle_row = index + 1
end_row = index + 2
sheet1 . merge_cells ( f " B { start_row } :B { end_row } " )
sheet1 [ f " B { index } " ] = srcDir_toStr ( road_value [ ' src_dir ' ] )
sheet1 [ f " B { index } " ] . alignment = Alignment ( horizontal = ' center ' , vertical = ' center ' )
index = end_row + 1
sheet1 [ f " C { start_row } " ] = " 优化前 "
sheet1 [ f " D { start_row } " ] = road_value [ ' dir_data ' ] [ ' comp_data ' ] [ ' service_level ' ]
sheet1 [ f " E { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' comp_data ' ] [ ' service_level ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " F { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' comp_data ' ] [ ' service_level ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " G { start_row } " ] = road_value [ ' dir_data ' ] [ ' comp_data ' ] [ ' stop_times ' ]
sheet1 [ f " H { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' comp_data ' ] [ ' stop_times ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " I { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' comp_data ' ] [ ' stop_times ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " J { start_row } " ] = road_value [ ' dir_data ' ] [ ' comp_data ' ] [ ' high_park_percent ' ]
sheet1 [ f " K { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' comp_data ' ] [ ' high_park_percent ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " L { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' comp_data ' ] [ ' high_park_percent ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " M { start_row } " ] = road_value [ ' dir_data ' ] [ ' comp_data ' ] [ ' delay_time ' ]
sheet1 [ f " M { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' comp_data ' ] [ ' delay_time ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " N { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' comp_data ' ] [ ' delay_time ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " P { start_row } " ] = road_value [ ' dir_data ' ] [ ' comp_data ' ] [ ' speed ' ]
sheet1 [ f " Q { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' comp_data ' ] [ ' speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " R { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' comp_data ' ] [ ' speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " S { start_row } " ] = road_value [ ' dir_data ' ] [ ' comp_data ' ] [ ' move_speed ' ]
sheet1 [ f " T { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' comp_data ' ] [ ' move_speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " U { start_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' comp_data ' ] [ ' move_speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " V { start_row } " ] = road_value [ ' dir_data ' ] [ ' comp_data ' ] [ ' imbalance_index ' ]
2025-12-03 18:19:02 +08:00
2025-12-04 16:04:38 +08:00
sheet1 [ f " C { middle_row } " ] = " 优化后 "
sheet1 [ f " D { middle_row } " ] = road_value [ ' dir_data ' ] [ ' item_data ' ] [ ' service_level ' ]
sheet1 [ f " E { middle_row } " ] = road_value [ ' dir_data ' ][ ' flow_delay_datas ' ][1][ ' item_data ' ][ ' service_level ' ] if road_value[ ' dir_data ' ][ ' flow_delay_datas ' ].get(1) else ' '
sheet1 [ f " F { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' item_data ' ] [ ' service_level ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " G { middle_row } " ] = road_value [ ' dir_data ' ] [ ' item_data ' ] [ ' stop_times ' ]
sheet1 [ f " H { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' item_data ' ] [ ' stop_times ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " I { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' item_data ' ] [ ' stop_times ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " J { middle_row } " ] = road_value [ ' dir_data ' ] [ ' item_data ' ] [ ' high_park_percent ' ]
sheet1 [ f " K { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' item_data ' ] [ ' high_park_percent ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " L { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' item_data ' ] [ ' high_park_percent ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " M { middle_row } " ] = road_value [ ' dir_data ' ] [ ' item_data ' ] [ ' delay_time ' ]
sheet1 [ f " N { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' item_data ' ] [ ' delay_time ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " O { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' item_data ' ] [ ' delay_time ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " P { middle_row } " ] = road_value [ ' dir_data ' ] [ ' item_data ' ] [ ' speed ' ]
sheet1 [ f " Q { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' item_data ' ] [ ' speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " R { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' item_data ' ] [ ' speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " S { middle_row } " ] = road_value [ ' dir_data ' ] [ ' item_data ' ] [ ' move_speed ' ]
sheet1 [ f " T { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' item_data ' ] [ ' move_speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " U { middle_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' item_data ' ] [ ' move_speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " V { middle_row } " ] = road_value [ ' dir_data ' ] [ ' item_data ' ] [ ' imbalance_index ' ]
sheet1 [ f " C { end_row } " ] = " 变化量 "
sheet1 [ f " D { end_row } " ] = road_value [ ' dir_data ' ] [ ' diff_data ' ] [ ' service_level ' ]
sheet1 [ f " E { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' diff_data ' ] [ ' service_level ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " F { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' diff_data ' ] [ ' service_level ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " G { end_row } " ] = road_value [ ' dir_data ' ] [ ' diff_data ' ] [ ' stop_times ' ]
sheet1 [ f " H { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' diff_data ' ] [ ' stop_times ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " I { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' diff_data ' ] [ ' stop_times ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " J { end_row } " ] = road_value [ ' dir_data ' ] [ ' diff_data ' ] [ ' high_park_percent ' ]
sheet1 [ f " K { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' diff_data ' ] [ ' high_park_percent ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " L { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' diff_data ' ] [ ' high_park_percent ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " M { end_row } " ] = road_value [ ' dir_data ' ] [ ' diff_data ' ] [ ' delay_time ' ]
sheet1 [ f " N { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' diff_data ' ] [ ' delay_time ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " O { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' diff_data ' ] [ ' delay_time ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " P { end_row } " ] = road_value [ ' dir_data ' ] [ ' diff_data ' ] [ ' speed ' ]
sheet1 [ f " Q { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' diff_data ' ] [ ' speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " R { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' diff_data ' ] [ ' speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " S { end_row } " ] = road_value [ ' dir_data ' ] [ ' diff_data ' ] [ ' move_speed ' ]
sheet1 [ f " T { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 1 ] [ ' diff_data ' ] [ ' move_speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 1 ) else ' '
sheet1 [ f " U { end_row } " ] = road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] [ 0 ] [ ' diff_data ' ] [ ' move_speed ' ] if road_value [ ' dir_data ' ] [ ' flow_delay_datas ' ] . get ( 0 ) else ' '
sheet1 [ f " V { end_row } " ] = road_value [ ' dir_data ' ] [ ' diff_data ' ] [ ' imbalance_index ' ]
center_alignment = Alignment ( horizontal = ' center ' , vertical = ' center ' )
for row in sheet1 . iter_rows ( min_row = 1 , max_row = sheet1 . max_row ,
min_col = 1 , max_col = sheet1 . max_column ) :
for cell in row :
if cell . value is not None :
cell . alignment = center_alignment
file_name = f " 【 { cross_name } 】 { compare_date_list [ 0 ] } - { compare_date_list [ - 1 ] } vs { date_list [ 0 ] } - { date_list [ - 1 ] } { time_range } 进口道及转向运行指标.xlsx "
2025-12-03 18:19:02 +08:00
file_stream = io . BytesIO ( )
wb . save ( file_stream )
file_stream . seek ( 0 ) # 将指针移到文件开头
return send_file (
file_stream ,
mimetype = ' application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ' ,
as_attachment = True ,
2025-12-04 16:04:38 +08:00
download_name = file_name )
2025-12-10 09:49:37 +08:00
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