From da7a6dd045747d880a02a22712e2aacbcd86a955 Mon Sep 17 00:00:00 2001 From: YiLin <482244139@qq.com> Date: Tue, 10 Feb 2026 14:42:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8A=E4=BC=A0=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=BA=E5=B9=B4=E6=9C=88=E6=97=A5=E6=97=B6=E5=88=86?= =?UTF-8?q?=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- globals/__pycache__/apis.cpython-312.pyc | Bin 21512 -> 21974 bytes globals/apis.py | 260 +++++++++--------- .../screenshot_page.cpython-312.pyc | Bin 62138 -> 62138 bytes .../upload_config_page.cpython-312.pyc | Bin 78155 -> 77790 bytes page_objects/upload_config_page.py | 15 +- scheduler.py | 60 ++-- test_results/上传失败的断点.txt | 3 +- 7 files changed, 179 insertions(+), 159 deletions(-) diff --git a/globals/__pycache__/apis.cpython-312.pyc b/globals/__pycache__/apis.cpython-312.pyc index d20ad2a6fb2f2eb27ec40e49a0b41d035c05af1a..ad1efcaf17544942070da1464cbe68f07774a319 100644 GIT binary patch delta 5186 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 delta 4803 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 diff --git a/globals/apis.py b/globals/apis.py index 3fc3b9b..57700b3 100644 --- a/globals/apis.py +++ b/globals/apis.py @@ -1,6 +1,7 @@ import requests import json import logging +import time import socket from typing import Optional, Dict, Any import globals.global_variable as global_variable @@ -52,58 +53,6 @@ def send_tcp_command(command="StartMultiple", host="127.0.0.1", port=8888, timeo logging.info(f"发送命令时发生错误: {str(e)}") return None -def get_breakpoint_list(): - """ - 获取需要处理的断点列表 - """ - # 请求参数 - params = { - 'user_name': global_variable.get_username() - } - - # 请求地址 - url = "https://engineering.yuxindazhineng.com/index/index/get_name_all" - - try: - # 发送GET请求 - response = requests.get(url, params=params, timeout=30) - - # 检查请求是否成功 - if response.status_code == 200: - result = response.json() - - # 检查接口返回状态 - if result.get('code') == 0: - data = result.get('data', []) - logging.info("成功获取断点列表,数据条数:", len(data)) - - # 打印断点信息 - # for item in data: - # logging.info(f"线路编码: {item.get('line_num')}, " - # f"线路名称: {item.get('line_name')}, " - # f"状态: {item.get('status')}, " - # f"用户: {item.get('name')}") - - return data - else: - logging.info(f"接口返回错误: {result.get('code')}") - return [{"id": 37, - "user_name": "wangshun", - "name": "wangshun", - "line_num": "L193588", - "line_name": "CDWZQ-2标-155号路基左线-461221-461570-155左-平原", - "status": 3 - }] - else: - logging.info(f"请求失败,状态码: {response.status_code}") - return [] - - except requests.exceptions.RequestException as e: - logging.info(f"请求异常: {e}") - return [] - except ValueError as e: - logging.info(f"JSON解析错误: {e}") - return [] def get_measurement_task(): """ @@ -388,96 +337,139 @@ def get_line_info_and_save_global(user_name: str) -> bool: api_url = "https://engineering.yuxindazhineng.com/index/index/get_name_all" request_params = {"user_name": user_name} # GET请求参数 timeout = 10 # 请求超时时间(秒),避免卡进程 + max_retries = 3 # 最大重试次数 + retry_interval = 2 # 重试间隔(秒) - try: - # 1. 发送GET请求 - response = requests.get( - url=api_url, - params=request_params, # GET参数用params传递,自动拼接到URL后,规范且防乱码 - timeout=timeout, - verify=False # 禁用SSL验证,适配HTTPS接口 - ) - - # 2. 校验HTTP状态码(先确保请求本身成功) - if response.status_code != 200: - logging.error(f"接口请求失败,HTTP状态码异常:{response.status_code},响应内容:{response.text}") - return False - - # 3. 解析JSON响应(接口返回是JSON格式,需解析为字典) + for retry in range(max_retries): try: - response_data = response.json() - except Exception as e: - logging.error(f"接口返回内容非合法JSON,无法解析:{response.text},错误:{str(e)}") - return False + # 1. 发送GET请求 + response = requests.get( + url=api_url, + params=request_params, # GET参数用params传递,自动拼接到URL后,规范且防乱码 + timeout=timeout, + verify=False # 禁用SSL验证,适配HTTPS接口 + ) - # 4. 校验业务状态码(接口约定:code=0成功,-1失败) - business_code = response_data.get("code") - if business_code == 0: - logging.info("接口业务请求成功,开始解析数据") - elif business_code == -1: - logging.error(f"接口业务请求失败,业务状态码code=-1,返回数据:{response_data}") - return False - else: - logging.warning(f"接口返回未知业务状态码:{business_code},请确认接口文档") - return False + # 2. 校验HTTP状态码(先确保请求本身成功) + if response.status_code != 200: + logging.error(f"接口请求失败,HTTP状态码异常:{response.status_code},响应内容:{response.text}") + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) + continue + return False - # 5. 提取data字段,校验数据是否存在 - api_data_list = response_data.get("data") - if not api_data_list: - logging.warning("接口业务成功,但data字段为空或无数据") - return False + # 3. 解析JSON响应(接口返回是JSON格式,需解析为字典) + try: + response_data = response.json() + except Exception as e: + logging.error(f"接口返回内容非合法JSON,无法解析:{response.text},错误:{str(e)}") + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) + continue + return False - # 6. 校验data是否为列表类型 - if not isinstance(api_data_list, list): - logging.error(f"data字段不是列表类型,实际类型:{type(api_data_list)},内容:{api_data_list}") - return False + # 4. 校验业务状态码(接口约定:code=0成功,-1失败) + business_code = response_data.get("code") + if business_code == 0: + logging.info("接口业务请求成功,开始解析数据") + elif business_code == -1: + logging.error(f"接口业务请求失败,业务状态码code=-1,返回数据:{response_data}") + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) + continue + return False + else: + logging.warning(f"接口返回未知业务状态码:{business_code},请确认接口文档") + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) + continue + return False - found_valid_data = False - - # 7. 遍历列表,提取所有status=3的数据 - for item in api_data_list: - # 确保每个item是字典 - if not isinstance(item, dict): - logging.warning(f"列表中的元素不是字典类型,跳过:{item}") + # 5. 提取data字段,校验数据是否存在 + api_data_list = response_data.get("data") + if not api_data_list: + logging.warning("接口业务成功,但data字段为空或无数据") + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) + continue + return False + + # 6. 校验data是否为列表类型 + if not isinstance(api_data_list, list): + logging.error(f"data字段不是列表类型,实际类型:{type(api_data_list)},内容:{api_data_list}") + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) + continue + return False + + found_valid_data = False + + # 7. 遍历列表,提取所有status=3的数据 + for item in api_data_list: + # 确保每个item是字典 + if not isinstance(item, dict): + logging.warning(f"列表中的元素不是字典类型,跳过:{item}") + continue + + # 获取字段值 + data_status = item.get("status") + line_num = item.get("line_num") + line_name = item.get("line_name") + + # 校验status是否为3,且目标字段非空 + if data_status == 3 and line_num and line_name: + # # 存入全局字典:key=line_num,value=line_name + # global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT[line_num] = line_name + # 存入全局字典:key=line_name,value=line_num + global_variable.get_upload_breakpoint_dict()[line_name] = line_num + + print(f"当前全局字典数据上传线路字典数据:{global_variable.get_upload_breakpoint_dict()}") + # 如果line_name不在列表中,则添加 + if line_name not in global_variable.get_upload_breakpoint_list(): + global_variable.get_upload_breakpoint_list().append(line_name) + + logging.info(f"找到status=3的线路信息:line_num={line_num}, line_name={line_name}") + found_valid_data = True + + if found_valid_data: + logging.info(f"成功提取所有status=3的线路信息,当前全局字典数据:{global_variable.get_upload_breakpoint_dict()}") + return True + else: + logging.warning("data列表中未找到任何status=3且字段完整的线路信息") + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) + continue + return False + + # 捕获所有请求相关异常(超时、连接失败、网络异常等) + except requests.exceptions.Timeout: + logging.error(f"调用get_name_all接口超时,超时时间:{timeout}秒,请求参数:{request_params}") + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) + continue + return False + except requests.exceptions.ConnectionError: + logging.error(f"调用get_name_all接口连接失败,检查网络或接口地址是否正确:{api_url}") + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) + continue + return False + except Exception as e: + logging.error(f"调用get_name_all接口时发生未知异常:{str(e)}", exc_info=True) # exc_info=True打印异常堆栈,方便排查 + if retry < max_retries - 1: + logging.info(f"将在{retry_interval}秒后进行第{retry+2}次重试") + time.sleep(retry_interval) continue - - # 获取字段值 - data_status = item.get("status") - line_num = item.get("line_num") - line_name = item.get("line_name") - - # 校验status是否为3,且目标字段非空 - if data_status == 3 and line_num and line_name: - # # 存入全局字典:key=line_num,value=line_name - # global_variable.GLOBAL_UPLOAD_BREAKPOINT_DICT[line_num] = line_name - # 存入全局字典:key=line_name,value=line_num - global_variable.get_upload_breakpoint_dict()[line_name] = line_num - - print(f"当前全局字典数据上传线路字典数据:{global_variable.get_upload_breakpoint_dict()}") - # 如果line_name不在列表中,则添加 - if line_name not in global_variable.get_upload_breakpoint_list(): - global_variable.get_upload_breakpoint_list().append(line_name) - - logging.info(f"找到status=3的线路信息:line_num={line_num}, line_name={line_name}") - found_valid_data = True - - if found_valid_data: - logging.info(f"成功提取所有status=3的线路信息,当前全局字典数据:{global_variable.get_upload_breakpoint_dict()}") - return True - else: - logging.warning("data列表中未找到任何status=3且字段完整的线路信息") return False - - # 捕获所有请求相关异常(超时、连接失败、网络异常等) - except requests.exceptions.Timeout: - logging.error(f"调用get_name_all接口超时,超时时间:{timeout}秒,请求参数:{request_params}") - return False - except requests.exceptions.ConnectionError: - logging.error(f"调用get_name_all接口连接失败,检查网络或接口地址是否正确:{api_url}") - return False - except Exception as e: - logging.error(f"调用get_name_all接口时发生未知异常:{str(e)}", exc_info=True) # exc_info=True打印异常堆栈,方便排查 - return False def get_accounts_from_server(yh_id): """从服务器获取账户信息""" diff --git a/page_objects/__pycache__/screenshot_page.cpython-312.pyc b/page_objects/__pycache__/screenshot_page.cpython-312.pyc index be486cb773b979c23c205c770012fe19da4d9195..254efe3f9573df7445337a992d2e8073abd8bf91 100644 GIT binary patch delta 458 zcmdn>lzG=vX0Fq`yj%=GV83Z2SC9@9YYSbbf8dC#^k9cK}wk*W)_gR#a5hO zRFaxfWDgR_1`$CZB4;zFsVEa0MBQc;^FmI}m#jbuO~#^z$@3hhG8S((aTH`^D*!3Z z-|X$g$F5ZcVpoHRW*~8kxwtI(7E5_%TIMbGl+5D9q@2`{qFRu2-R5S`w=5c{>WdbE zq!xp8vZdyssGi}sheZZe^(~f^#1e#g1;HKc+(;@WGe;}4LG99s=I3P0-fWYynu9TU z@{1gM#)i!rxx4s*oX0g5K#ol96Hdm~&5Z4O0*tAf4W|2R0eKAvg_wXUCLdO0%-p>7 zumeA1(&lfM#26WqH}hVxU;zrc-RNZjs^GmME5rtLwI*wk1jq-1AfjP2^W8~2jJ1=e zy`00CIobG?3S;Wzh*uqqxtkxp+ROr!nEKvJAQhyv5JZ%Mh>Fec-zzc!l?#4a2>@qQ BiVXk& delta 458 zcmdn>lzG=vX0Fq`yj%=G;IU>SSC9_VOV-VCI))r<89)}n zs3bL|$Q~q;10sSzMDAuzQ&A>1h`P-x=7pS`MM*#jO~#_e$@3hhGL~#MaTH`^D+DPn z*zE1Z$F5ZkV%LC(79eqpxwtI(7E5_%TIMbGl+5D9q@2`{qB@Xt{pM!Rw=5c{>WdbE zq!xp8vZdyssGi}sheZZe^(~f^#1e#g1;HKc+(;@WGe;}4LG99s=I3P0*=&=tnu9TA z@{1gM#>UMWxx4s*oX0g5K#ol96HdmY&5Z4O0*q;!4W|2R0eKAvg_wXUCLdO0%-X#5 zumeA1^5$=s#26V_p8 BiWUF> diff --git a/page_objects/__pycache__/upload_config_page.cpython-312.pyc b/page_objects/__pycache__/upload_config_page.cpython-312.pyc index 9ab255e958ffe94d91c0193e915d06b7e1a6816b..1b5ea0c82acbb8527eb96b6ef36e61a04b158399 100644 GIT binary patch delta 305 zcmX^8h~?gW7T(jmyj%=G@Nr>R=AlO3t-Op)9E{4_CvY&%WaJ9GEMk!=WR6KY@&Kvh8b(0!gtQ|UkUFX6C0+-Spio zjMCfvxEN2fGCFOS5@0;d!T4wUGYQ7^94s{qS@x4JYDrD^mtxdqRGeNb#b_?Bw3-oQ zECT~0Ly01U#lVo|08+=4wu~y%uL3DH)lwCp(#ejWB(@tU zF}5%%l}Z5l&)0T7-PihLN7s`*3!bj)dDb!E>5`2vwk!oJo_;`uQBtsT`HO`;5V??2 zO^6wC+i$2ao@V59Wno}wVEDk2vVDyj;~r+d4;&0464!-|E(#l65jL5AQG-!zvf?*k zxhFi**LmzN^4MMGak$Roev!xh1pgJDhzG*rKc4VQOfS@8G^lR?8r|e*63obO&|C*d z9#YW;l7|Hx*?`m$aYr#AbyN=|b4=Qi2S^>)FanY%q#e0{)JZi*DIj&4Q3XV*f!Jpl zL5k1lIjRDwb0SXaKjQl~ejFO)iKxB~|&~*Sm(~KSf diff --git a/page_objects/upload_config_page.py b/page_objects/upload_config_page.py index d645bc3..fb1906f 100644 --- a/page_objects/upload_config_page.py +++ b/page_objects/upload_config_page.py @@ -1666,7 +1666,7 @@ class UploadConfigPage: minor_conditions_list = [] # 次要工况列表 [{point_id, work_type, workinfoname}] # 定义阈值:出现次数少于这个值的认为是次要工况 - minor_threshold = 3 # 可以根据实际情况调整 + minor_threshold = 2 # 可以根据实际情况调整 for work_type, workinfoname_counts in work_type_stats.items(): if workinfoname_counts: @@ -1862,13 +1862,14 @@ class UploadConfigPage: return False - # # 表达填写完成,点击"保存上传"并处理弹窗 - # if not self.click_save_upload_and_handle_dialogs(): - # self.logger.error("点击保存上传并处理弹窗失败") - # return False + # 表达填写完成,点击"保存上传"并处理弹窗 + if not self.click_save_upload_and_handle_dialogs(): + self.logger.error("点击保存上传并处理弹窗失败") + return False - # 暂不上传,使用返回按钮替代。 - self.driver.back() + # # 暂不上传,使用返回按钮替代。 + # self.driver.back() + # return True # 等待上传,查看loading弹窗。没有就下一个 diff --git a/scheduler.py b/scheduler.py index a2b35cb..243acd5 100644 --- a/scheduler.py +++ b/scheduler.py @@ -29,15 +29,7 @@ def update_file_status(username, from_status, to_status): try: with open(TIME_FILE_PATH, 'r', encoding='utf-8') as f: lines = f.readlines() - - # new_lines = [] - # for line in lines: - # clean_line = line.strip() - # # 匹配逻辑:包含用户名 且 以 from_status 结尾 - # if f" {username} " in line and clean_line.endswith(from_status): - # line = line.replace(from_status, to_status) - # success = True - # new_lines.append(line) + new_lines = [] for line in lines: # 使用正则确保精准匹配用户名和结尾状态 @@ -73,7 +65,7 @@ def parse_time_config(): for line in f: line = line.strip() # 匹配:用户名 时间 true (仅获取待处理任务) - match = re.search(r'(\w+)\s+(\d{1,2}:\d{2}:\d{2})\s+ok$', line) + match = re.search(r'(\w+)\s+(\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{2}:\d{2})\s+ok$', line) if match: username, scheduled_time = match.group(1), match.group(2) time_map[username] = scheduled_time @@ -81,6 +73,39 @@ def parse_time_config(): print(f"❌ 解析 time.txt 失败: {e}") return time_map + + +def normalize_datetime(time_str): + """ + 将时间字符串格式化为标准格式:YYYY-MM-DD HH:MM:SS + 补全单数字的月、日、时 + 例如:2024-1-15 9:52:20 -> 2024-01-15 09:52:20 + """ + try: + # 分割日期和时间部分 + if ' ' in time_str: + date_part, time_part = time_str.split(' ', 1) + + # 补全日期部分的单数字 + date_parts = date_part.split('-') + if len(date_parts) == 3: + year = date_parts[0] + month = date_parts[1].zfill(2) # 月补零 + day = date_parts[2].zfill(2) # 日补零 + date_part = f"{year}-{month}-{day}" + + # 补全时间部分的单数字小时 + time_parts = time_part.split(':') + if len(time_parts) >= 1: + hour = time_parts[0].zfill(2) # 小时补零 + time_part = f"{hour}:{':'.join(time_parts[1:])}" + + return f"{date_part} {time_part}" + return time_str + except Exception as e: + print(f"⚠️ 时间格式标准化失败 ({time_str}): {e}") + return time_str + def get_combined_tasks(): """ 结合接口(is_ok==1)和本地文件(ok)筛选任务 @@ -96,10 +121,10 @@ def get_combined_tasks(): return {} task_list = {} - today = datetime.now().strftime("%Y-%m-%d") + # today = datetime.now().strftime("%Y-%m-%d") for account in accounts: - if account.get('is_ok') == 1 or account.get('username') == "CZSCZQ13A1xuliguo": + if account.get('is_ok') == 1: user = account.get('username') ip = account.get('device_ip') port = account.get('device_port') @@ -111,12 +136,13 @@ def get_combined_tasks(): # 确保时间是两位数格式 raw_time = local_times[user] # 将时间格式化为两位数:9:52:20 -> 09:52:20 - if ':' in raw_time: - parts = raw_time.split(':') - if len(parts[0]) == 1: - raw_time = f"0{raw_time}" # 补齐前导零 + # if ':' in raw_time: + # parts = raw_time.split(':') + # if len(parts[0]) == 1: + # raw_time = f"0{raw_time}" # 补齐前导零 - full_time = f"{today} {raw_time}" + # full_time = f"{today} {raw_time}" + full_time = normalize_datetime(raw_time) task_list[address] = {"time": full_time, "user": user} return task_list diff --git a/test_results/上传失败的断点.txt b/test_results/上传失败的断点.txt index f71ccdf..7dcde69 100644 --- a/test_results/上传失败的断点.txt +++ b/test_results/上传失败的断点.txt @@ -1,3 +1,4 @@ -CZSCZQ-13A-二工区-沙马大桥-7#墩-山区 +CZSCZQ-13A-二工区-沙马大桥-6#墩-山区 CZSCZQ-13A-二工区-沙马大桥-2#墩身-山区 CZSCZQ-13A-二工区-沙马大桥-1#墩身-山区 +CZSCZQ-13A-二工区-沙马大桥-7#墩-山区