diff --git a/app/task_db_func.py b/app/task_db_func.py index db47e68..42f7169 100644 --- a/app/task_db_func.py +++ b/app/task_db_func.py @@ -564,19 +564,30 @@ class TaskDbHelper(TableDbHelperBase): task_tp_info_dict[tp_key]['wave_tp_id'] = wave_tp_info_dict[tp_key] else: return False - update_sql = """ - update task.greenwave_task_tp_detail set wave_tp_id = %s where tp_start = %s and tp_end = %s and weekday = %s and task_no = %s and nodeid = %s and area_id = %s - """ - conn, cursor = self.connect() - try: - for tp_info in task_tp_info_dict.values(): - cursor.execute(update_sql, (tp_info['wave_tp_id'], tp_info['tp_start'], tp_info['tp_end'], tp_info['weekday'], task_no, nodeid, area_id)) - conn.commit() - return True - except Exception as e: - conn.rollback() - print(e) - return False + # 补充跳过需求确认单没有任务时段信息时需要将 + if not task_tp_info_dict: + insert_list = [] + for tp_info in wave_tp_info: + insert_list.append((task_no, tp_info['wave_tp_id'], tp_info['tp_start'], tp_info['tp_end'], tp_info['type_str'], tp_info['type_str'], tp_info['weekday'], nodeid, area_id)) + insert_sql = """ + insert into task.greenwave_task_tp_detail(task_no, wave_tp_id, tp_start, tp_end, coor_dir, priority_coor_dir, weekday, nodeid, area_id) values (%s, %s, %s, %s, %s, %s, %s, %s, %s) + """ + ret = self.do_executemany(insert_sql, insert_list) + return ret == len(insert_list) + else: + update_sql = """ + update task.greenwave_task_tp_detail set wave_tp_id = %s where tp_start = %s and tp_end = %s and weekday = %s and task_no = %s and nodeid = %s and area_id = %s + """ + conn, cursor = self.connect() + try: + for tp_info in task_tp_info_dict.values(): + cursor.execute(update_sql, (tp_info['wave_tp_id'], tp_info['tp_start'], tp_info['tp_end'], tp_info['weekday'], task_no, nodeid, area_id)) + conn.commit() + return True + except Exception as e: + conn.rollback() + print(e) + return False def update_stage1_info(self, task_no, waveid, wave_name, task_stage, task_info, wave_crosses): conn, cursor = self.connect() diff --git a/app/task_worker.py b/app/task_worker.py index 4da888e..130238f 100644 --- a/app/task_worker.py +++ b/app/task_worker.py @@ -11,13 +11,14 @@ from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import formataddr +from app.eva_common import query_cross_ledger_info from app.global_source import db_user, db_task from flask import request, send_file from pypinyin import lazy_pinyin, Style from app.common_worker import * from app.wave_db_func import gen_type_str, gen_weekday_str -from proto.phase_grpc import LedgerTaskDetailPhaseState, TaskWaveCrossTpPhaseRPC +from proto.phase_grpc import LedgerTaskDetailPhaseState, TaskWaveCrossTpPhaseRPC, CrossPhaseState from tool.qcos_func import get_client, CosFolderManager ALLOWED_EXTENSION_TASK = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'doc', 'docx', 'xlsx', 'xls', 'pptx', 'ppt'} @@ -65,10 +66,11 @@ def do_query_task_list_parameter(params): if len(executors)<=0: logging.error(' query_task_executor没有数据!') - executor_list = [] + executor_list, usable_user_list = [], [] for executor in executors: executor_list.append(executor['user_name']) res['data']['executor'] = executor_list + res['data']['usable_user_list'] = executors #需求来源 srcs = db_task.query_task_src(nodeid, area_id) @@ -79,6 +81,12 @@ def do_query_task_list_parameter(params): src_list.append(src['src']) res['data']['task_src'] = src_list + # 20260408 新增路口巡检任务所需参数,当前辖区巡检路口数量 + routing_crosses = db_tmnet.query_area_routing_focus_cross_num(nodeid, area_id) + focus_crosses = [row['crossid'] for row in routing_crosses if row['is_focus'] == 1] + res['data']['routing_crosses_num'] = len(routing_crosses) + res['data']['focus_crosses_num'] = len(focus_crosses) + return json.dumps(res) @@ -1003,7 +1011,7 @@ def do_query_task_detail(params): wave_name = wave_info['name'] if wave_info else '' executor = task['executor'] creator = task['creatorid'] - greenwave_task_additional_info = gen_greenwave_task_additional_info(taskno, nodeid, area_id, waveid, wave_name, creator, executor) + greenwave_task_additional_info = gen_greenwave_task_additional_info(taskno, nodeid, area_id, waveid, wave_name, creator, executor, userid) task['greenwave_task_additional_info'] = greenwave_task_additional_info task.pop('update_time') res['desc'] = '' @@ -1395,12 +1403,12 @@ def verify_cross_entering_status(params): if not crossid_list or len(crossid_list) < 1: return json.dumps(make_common_res(6, '缺少crossid_list, 请刷新后重试')) - cross_enter_status = db_task.query_cross_entering_status(crossid_list) + cross_enter_status = query_cross_entering_info(crossid_list, nodeid, area_id, userid) cross_status_dict = {} - for row in cross_enter_status: - cross_status_dict[row['crossid']] = { - 'ledger_status': row['ledger_status'], - 'phase_status': row['phase_status'] + for crossid in cross_enter_status.keys(): + cross_status_dict[crossid] = { + 'ledger_status': cross_enter_status[crossid]['ledger_status'], + 'phase_status': cross_enter_status[crossid]['phase_status'] } verify_res = True for crossid in crossid_list: @@ -1524,7 +1532,15 @@ def query_wave_task_params(params): left_coor = 0 left_coor = int(left_coor) # 需要查明 路口名称、信号机品牌、 最大相位数量、绿波时段信息、配时方案信息 - wave_tp_info = [] + wave_tp_info = [{ + 'wave_tp_id': 0, + 'type_str': '双向', + 'weekday_str': '全周', + 'type': 2, + 'weekday': '1,2,3,4,5,6,7', + 'tp_start': '09:00', + 'tp_end': '17:00' + }] if waveid != '' and srcDir != '': wave_tp_info = db_wave.query_wave_tp_infos(waveid, srcDir) wave_tp_info_phase = [{'tp_start': row['tp_start'], 'tp_end': row['tp_end'], 'weekday': row['weekday']} for row in wave_tp_info] @@ -1565,16 +1581,6 @@ def query_wave_task_params(params): if srcDir != '': usable_src_dir_list = ['双向', gen_type_str(0, srcDir), gen_type_str(1, srcDir)] task_executor_list = db_task.query_task_executor(nodeid, area_id) - if waveid == '' and wave_name == '': - wave_tp_info = [{ - 'wave_tp_id': 0, - 'type_str': '双向', - 'weekday_str': '全周', - 'type': 2, - 'weekday': '1,2,3,4,5,6,7', - 'tp_start': '09:00', - 'tp_end': '17:00' - }] res = make_common_res(0, 'ok') res['data'] = { 'base_info': { @@ -1587,7 +1593,7 @@ def query_wave_task_params(params): 'predict_issue_time': predict_issue_time, 'wave_status': 1 if waveid != '' else 0, 'cross_num': len(wave_crosses), - 'slc_company': slc_company_dict[int(slc_company)] if slc_company_res and int(slc_company) in slc_company_dict.keys() else '不统一', + 'slc_company': slc_company_dict[int(slc_company)] if slc_company and slc_company_res and int(slc_company) in slc_company_dict.keys() else '不统一', 'task_src': task_src, 'max_phase_position': max_phase_position, 'left_coor': left_coor @@ -1604,15 +1610,14 @@ def query_wave_task_params(params): # 附加信息查询 -def gen_greenwave_task_additional_info(taskno, nodeid, area_id, waveid, wave_name, creator, executor): +def gen_greenwave_task_additional_info(taskno, nodeid, area_id, waveid, wave_name, creator, executor, userid): # 需求确认单信息 greenwave_task_detail = db_task.query_greenwave_task_requirement_validation_info_sql(taskno) additional_base_res = db_task.query_wave_task_additional_info_sql(taskno, nodeid, area_id) stage_info = additional_base_res['task_stage'] task_crosses = db_task.query_wave_task_crosses(taskno) task_crossid_list = [row['crossid'] for row in task_crosses if row['crossid'] and row['crossid'] != ''] - cross_entering_info = db_task.query_cross_entering_status(task_crossid_list) - cross_entering_status_dict = {row['crossid']: row for row in cross_entering_info} + cross_entering_status_dict = query_cross_entering_info(task_crossid_list, nodeid, area_id, userid) task_tp_info = db_task.query_wave_task_tp_info(taskno, nodeid, area_id) wave_tp_optimize_records = db_wave.query_wave_tp_optimize_records(waveid) if waveid != '' else {} # tp_check_res = db_task.query_task_check_res(taskno, nodeid, area_id) @@ -1830,7 +1835,7 @@ def update_greenwave_task_stage_info(params): wave_tp_info = db_wave.query_wave_tp_infos(waveid, wave_info['srcDir']) async_tp_info_res = db_task.async_wave_tp_id(wave_tp_info, task_tp_info, task_no, nodeid, area_id) if not async_tp_info_res: - return json.dumps(make_common_res(15, '同步绿波时段表信息失败')) + return json.dumps(make_common_res(15, '当前绿波设置的运行时段与需求确认单中要求的协调时段不一致,请按需求确认单中要求调整')) ret = db_task.update_stage1_info(task_no, waveid, wave_name, stage_info, task_info, wave_crosses) if ret: send_confirm_email(userids, f'当前任务到达绿波优化阶段, 请及时处理', task_no, task_info['task_name'], '绿波优化阶段', nodeid, area_id, creator_name, executor_name) @@ -2181,4 +2186,104 @@ def del_greenwave_task_tiny_adjustment_record(params): return json.dumps(make_common_res(6, '删除失败')) +# 修改路口配时方案状态及台账录入状态查询逻辑 +def query_cross_entering_info(cross_list, nodeid, area_id, userid): + cross_phase_status_dict, e = CrossPhaseState(int(nodeid), cross_list) + check_modify_record_res = False + cross_entering_status_dict = {} + for crossid in cross_list: + ledger_status = 0 + if 'udc_' not in crossid: + check_modify_record_res = db_tmnet.query_cross_user_modify_record(nodeid, crossid) + if not check_modify_record_res: + cross_entering_status_dict[crossid] = { + 'phase_status': cross_phase_status_dict[crossid], + 'ledger_status': ledger_status + } + cross_ledger_info = query_cross_ledger_info(crossid, nodeid, area_id, userid) + if not cross_ledger_info or not cross_ledger_info['data']: + cross_entering_status_dict[crossid] = { + 'phase_status': cross_phase_status_dict[crossid], + 'ledger_status': ledger_status + } + + # 路口基本属性 + cross_name = cross_ledger_info['data']['ledger']['name'] + cross_type = cross_ledger_info['data']['ledger']['cross_type'] + cross_model = str(cross_ledger_info['data']['ledger']['primary']) + '-' + str(cross_ledger_info['data']['ledger']['secondary']) + division = cross_ledger_info['data']['ledger']['division'] + company = cross_ledger_info['data']['ledger']['company'] + slc_company = cross_ledger_info['data']['ledger']['slc_company'] + slc_state = cross_ledger_info['data']['ledger']['slc_state'] + slc_contral_tp = cross_ledger_info['data']['ledger']['slc_contral_tp'] + slc_contral_model = cross_ledger_info['data']['ledger']['slc_contral_model'] + internet = cross_ledger_info['data']['ledger']['internet'] + + # 路段属性 大都有默认值存在 + guard_state, right_canaliza_state, sidewalk_state, lane_widening_state, hold_left_state, hold_straight_state, reverse_turn_state, turn_back_state, bicycle_lane_state = 0, 0, 0, 0, 0, 0, 0, 0, 0 + roads_info = cross_ledger_info['data']['roads'] + for dir_info in roads_info.keys(): + dir_ledger_info = roads_info[dir_info] + canaliza = dir_ledger_info['canaliza'] + guard = canaliza['guard'] + right_canaliza = canaliza['right_canaliza'] + sidewalk = canaliza['sidewalk'] + lane_widening = canaliza['lane_widening'] + hold_left = canaliza['hold_left'] + hold_straight = canaliza['hold_straight'] + reverse_turn = canaliza['reverse_turn'] + turn_back = canaliza['turn_back'] + bicycle_lane = canaliza['bicycle_lane'] + if guard: + guard_state = 1 + if right_canaliza: + right_canaliza_state = 1 + if sidewalk: + sidewalk_state = 1 + if lane_widening: + lane_widening_state = 1 + if hold_left: + hold_left_state = 1 + if hold_straight: + hold_straight_state = 1 + if reverse_turn: + reverse_turn_state = 1 + if turn_back: + turn_back_state = 1 + if bicycle_lane: + bicycle_lane_state = 1 + + # 信号灯情况 + light_state, dir_lights = 0, {} + light_infos = cross_ledger_info['data']['light_infos'] + valid_dirs = [src_dir for src_dir in roads_info.keys() if roads_info[src_dir]['roadid'] != '-'] + for light_info in light_infos: + srcDir = light_info['srcDir'] + if srcDir not in dir_lights.keys(): + dir_lights[srcDir] = [] + dir_lights[srcDir].append(light_info['light_type']) + for dir in valid_dirs: + if dir in dir_lights.keys() and bool({0, 1, 2, 3, 4} & set(dir_lights[dir])): + light_state += 1 + + fields = [ + cross_name, cross_type, cross_model, division, company, + slc_company, slc_state, slc_contral_tp, slc_contral_model, + internet, guard_state, right_canaliza_state, sidewalk_state, + lane_widening_state, hold_left_state, hold_straight_state, + reverse_turn_state, turn_back_state, bicycle_lane_state + ] + if slc_state in (2, 4, 5): + light_state = len(valid_dirs) + if all(f is not None and f != "" for f in fields) and light_state == len(valid_dirs): + ledger_status = 2 + else: + ledger_status = 1 + cross_entering_status_dict[crossid] = { + 'phase_status': cross_phase_status_dict[crossid], + 'ledger_status': ledger_status + } + return cross_entering_status_dict + + # 路口巡检任务相关内容:20260407 diff --git a/app/tmnet_db_func.py b/app/tmnet_db_func.py index 2278e44..66382b1 100644 --- a/app/tmnet_db_func.py +++ b/app/tmnet_db_func.py @@ -756,4 +756,15 @@ class TmnetDbHelper(TableDbHelperBase): return res[0]['city_name'], res[0]['area_name'] return '', '' + def query_cross_user_modify_record(self, nodeid, crossid): + sql = """ + select * from tmnet.cross_ledger_update_info where nodeid = %s and crossid = '%s' + """ % (nodeid, crossid) + res = self.do_select(sql) + return False if len(res) == 0 or not res else True + def query_area_routing_focus_cross_num(self, nodeid, area_id): + sql = """ + select crossid, is_routing_inspection, is_focus from tmnet.bound_crosses where nodeid = %s and area_id = %s + """ % (nodeid, area_id) + return self.do_select(sql)