新增绿波优化任务相关查询绿波时段路口配时方案

Signed-off-by: yinzijian <yinzijian@haomozhixing.onaliyun.com>
This commit is contained in:
yinzijian 2026-03-19 16:53:47 +08:00
parent a8d074b463
commit 4219d99106
4 changed files with 179 additions and 3 deletions

View File

@ -256,3 +256,75 @@ def LedgerTaskDetailPhaseState(citycode: int, crossids: List[str]):
return None, e return None, e
finally: finally:
channel.close() channel.close()
def TaskWaveCrossTpPhaseRPC(citycode: int, crossids: List[str], tps: List):
"""
绿波优化任务相关根据路口时段查询配时方案
citycode = 130200
crossids = ['crossid1','crossid2']
tps = [{'weekday': '1,2,3,4,5','tp_start':'09:00', 'tp_end':'10:00'}, {'weekday': '6,7', 'tp_start':'11:00', 'tp_end':'12:00'}]
"""
stub, channel = channel_stub()
try:
return_data = []
return_data_map = {}
request_params = phase_server_pb2.TaskWaveCrossTpPhaseRequest(citycode=citycode,crossids=crossids,tps=tps)
response = stub.TaskWaveCrossTpPhase(request_params, timeout=30)
if response.code != 0:
raise Exception(response.msg)
if len(response.data) > 0:
for item_data in response.data:
if len(item_data.details) <= 0:
continue
for item_detail in item_data.details:
if len(item_detail.stages) <= 0:
continue
if item_data.crossid not in return_data_map:
return_data_map[item_data.crossid] = {}
key = f"{item_detail.search_tp_start}-{item_detail.search_tp_end}"
if key not in return_data_map[item_data.crossid]:
return_data_map[item_data.crossid][key] = {}
return_data_map[item_data.crossid][key] = {
'max_duration': item_detail.max_duration,
'search_tp_start': item_detail.search_tp_start,
'search_tp_end': item_detail.search_tp_end,
'schedule_id': item_detail.schedule_id,
'schedule_week': item_detail.schedule_week,
'tp_start': item_detail.tp_start,
'tp_end': item_detail.tp_end,
'planid': item_detail.planid,
'plan_name': item_detail.plan_name,
'cycle': item_detail.cycle,
'offset': item_detail.offset,
'phase_list': [],
}
for item_stage in item_detail.stages:
return_data_map[item_data.crossid][key]['phase_list'].append({
'phase_name': item_stage.stage_name,
'phase_time': item_stage.stage_duration,
})
for item_crossid in crossids:
if item_crossid in return_data_map:
item_return_data = {
'crossid': item_crossid,
'tp_infos': [],
}
for item_tp in tps:
tp_key = f"{item_tp['tp_start']}-{item_tp['tp_end']}"
if tp_key not in return_data_map[item_crossid]:
continue
item_return_data['tp_infos'].append({
'tp_start': return_data_map[item_crossid][tp_key]['search_tp_start'],
'tp_end': return_data_map[item_crossid][tp_key]['search_tp_end'],
'offset': return_data_map[item_crossid][tp_key]['offset'],
'phase_list': return_data_map[item_crossid][tp_key]['phase_list']
})
if len(item_return_data['tp_infos']) > 0:
return_data.append(item_return_data)
return return_data, None
except Exception as e:
return None, e
finally:
channel.close()

View File

@ -34,6 +34,8 @@ service PhaseService {
rpc CrossPhaseDiagnosisByCity (CrossPhaseDiagnosisByCityRequest) returns (CrossPhaseDiagnosisByCityResponse); rpc CrossPhaseDiagnosisByCity (CrossPhaseDiagnosisByCityRequest) returns (CrossPhaseDiagnosisByCityResponse);
// //
rpc LedgerTaskDetailPhaseStateUpdate (LedgerTaskDetailPhaseStateUpdateRequest) returns (LedgerTaskDetailPhaseStateUpdateResponse); rpc LedgerTaskDetailPhaseStateUpdate (LedgerTaskDetailPhaseStateUpdateRequest) returns (LedgerTaskDetailPhaseStateUpdateResponse);
//绿
rpc TaskWaveCrossTpPhase (TaskWaveCrossTpPhaseRequest) returns (TaskWaveCrossTpPhaseResponse);
} }
message EmptyRequest {} message EmptyRequest {}
@ -428,3 +430,49 @@ message LedgerTaskDetailPhaseStateUpdateResponse {
string msg = 2; string msg = 2;
} }
message TaskWaveCrossTpPhaseRequest {
int32 citycode = 1;
repeated string crossids = 2;
repeated TpInfo tps = 3;
message TpInfo {
string weekday = 1;
string tp_start = 2;
string tp_end = 3;
}
}
message TaskWaveCrossTpPhaseResponse {
int32 code = 1;
string msg = 2;
repeated List data = 3;
message List {
string crossid = 1;
repeated detail_info details = 2;
}
message detail_info {
int32 max_duration = 1; //
string search_tp_start = 2; //
string search_tp_end = 3; //
int32 schedule_id = 4;
string schedule_week = 5;
string tp_start = 6;
string tp_end = 7;
int32 planid = 8;
string plan_name = 9;
int32 cycle = 10;
int32 coord_phaseid = 11;
int32 offset = 12;
repeated stage_data stages = 13;
}
message stage_data {
int32 stageid = 1;
string stage_name = 2;
int32 stage_duration = 3;
int32 green = 4;
int32 yellow = 5;
int32 allred = 6;
int32 redyellow = 7;
string phaseids = 8;
string phase_name = 9;
}
}

File diff suppressed because one or more lines are too long

View File

@ -114,6 +114,11 @@ class PhaseServiceStub(object):
request_serializer=phase__server__pb2.LedgerTaskDetailPhaseStateUpdateRequest.SerializeToString, request_serializer=phase__server__pb2.LedgerTaskDetailPhaseStateUpdateRequest.SerializeToString,
response_deserializer=phase__server__pb2.LedgerTaskDetailPhaseStateUpdateResponse.FromString, response_deserializer=phase__server__pb2.LedgerTaskDetailPhaseStateUpdateResponse.FromString,
_registered_method=True) _registered_method=True)
self.TaskWaveCrossTpPhase = channel.unary_unary(
'/phase_server.PhaseService/TaskWaveCrossTpPhase',
request_serializer=phase__server__pb2.TaskWaveCrossTpPhaseRequest.SerializeToString,
response_deserializer=phase__server__pb2.TaskWaveCrossTpPhaseResponse.FromString,
_registered_method=True)
class PhaseServiceServicer(object): class PhaseServiceServicer(object):
@ -231,6 +236,13 @@ class PhaseServiceServicer(object):
context.set_details('Method not implemented!') context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!') raise NotImplementedError('Method not implemented!')
def TaskWaveCrossTpPhase(self, request, context):
"""绿波优化任务相关根据时段路口配时方案接口
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_PhaseServiceServicer_to_server(servicer, server): def add_PhaseServiceServicer_to_server(servicer, server):
rpc_method_handlers = { rpc_method_handlers = {
@ -314,6 +326,11 @@ def add_PhaseServiceServicer_to_server(servicer, server):
request_deserializer=phase__server__pb2.LedgerTaskDetailPhaseStateUpdateRequest.FromString, request_deserializer=phase__server__pb2.LedgerTaskDetailPhaseStateUpdateRequest.FromString,
response_serializer=phase__server__pb2.LedgerTaskDetailPhaseStateUpdateResponse.SerializeToString, response_serializer=phase__server__pb2.LedgerTaskDetailPhaseStateUpdateResponse.SerializeToString,
), ),
'TaskWaveCrossTpPhase': grpc.unary_unary_rpc_method_handler(
servicer.TaskWaveCrossTpPhase,
request_deserializer=phase__server__pb2.TaskWaveCrossTpPhaseRequest.FromString,
response_serializer=phase__server__pb2.TaskWaveCrossTpPhaseResponse.SerializeToString,
),
} }
generic_handler = grpc.method_handlers_generic_handler( generic_handler = grpc.method_handlers_generic_handler(
'phase_server.PhaseService', rpc_method_handlers) 'phase_server.PhaseService', rpc_method_handlers)
@ -756,3 +773,30 @@ class PhaseService(object):
timeout, timeout,
metadata, metadata,
_registered_method=True) _registered_method=True)
@staticmethod
def TaskWaveCrossTpPhase(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/phase_server.PhaseService/TaskWaveCrossTpPhase',
phase__server__pb2.TaskWaveCrossTpPhaseRequest.SerializeToString,
phase__server__pb2.TaskWaveCrossTpPhaseResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)