From fbdbed37f4e1ba6f28b8e60e3c38792123078592 Mon Sep 17 00:00:00 2001 From: YiLin <482244139@qq.com> Date: Thu, 12 Feb 2026 17:04:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B9=B3=E5=B7=AE=E6=97=B6?= =?UTF-8?q?=E6=89=BE=E4=B8=8D=E5=88=B0=E5=B9=B3=E5=B7=AE=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E5=B0=B1=E8=BF=94=E5=9B=9E=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/driver_utils.cpython-312.pyc | Bin 33156 -> 33158 bytes .../more_download_page.cpython-312.pyc | Bin 16769 -> 17813 bytes .../screenshot_page.cpython-312.pyc | Bin 62138 -> 64572 bytes .../upload_config_page.cpython-312.pyc | Bin 79742 -> 79742 bytes page_objects/more_download_page.py | 36 +++- page_objects/screenshot_page.py | 175 +++++++++++------- scheduler.py | 35 ++-- test_results/上传失败的断点.txt | 5 +- 8 files changed, 163 insertions(+), 88 deletions(-) diff --git a/globals/__pycache__/driver_utils.cpython-312.pyc b/globals/__pycache__/driver_utils.cpython-312.pyc index 6409e71535792e55bd7f20d1b860fff91112c9f4..9efb5f0681b3780afde69cee6b9d0208d1056297 100644 GIT binary patch delta 158 zcmZo^W@>9@;yumF%f$c$-@SS=gEsO?Mza3>;yumF%f$c$Rm(dwy*KhoMl;`HG+3-1&CD3QStsta5aapDKMFJ$Pfb=V z3}d{rxuVdHgYm)S?UkC0k2gQ8e89+fZt|h(DU2^Rhu7R;WIQw3q)vtL)#S*!qtdT| zrWU;c5}J&e#X=ye=p2|=^m?;peI=vb9gu>@AmRmxcm*ONK*S~x5db89aoFVMrdQ?*i5wY%p& z3{l!m+aJAu{NB0uoO91P_nv#sd+KTQ((|bFFJ`lWqvP)fPAX_@zO)+6%r^~pm=2i` zCvj3q#2hU>RLW>EQWmuwvLKG<202Op3?~`R@u16bhpdx=-#EW`%;ZM}Q5sFkNhK=h zbSRFD7Rtv~fO0a!N0B-ADgO^1S;>dOPE<+071~f0Y18>pH94#sLblu+y5I81MY{EA zBU7sb-Fk9a?;WnCWI+f;l+bZp3CkV;9Y6zs51^5PUxTaYr%)!v)3Hc=R2mseC6nM*URd4oO{e;1-}Ehxm2vXt@*XSm4#J_{(Lo)ov<;)K+_-JI zWJe3^(hAT<;Q($2@<#x>0XhIW0rrrGoJYkjO8TiOa^C51_rQ8DKoH=&cK+o&h*G&d zu5VF8Ka~g}3dJE(0#4%2*A!22dM=5`5ub~+R*AYS%Al~8EY;Z!yo8R|(9QppA^A!> znd_>sOMHfZnUgfHYR+wJh`0>-jB@=uDon}JqJ^-9oHyI1wZ(kOYBHK|d6B#I&1&g- z#n!w?Wrd7Z5*&1z5hNXarIIO{n^Tm^>L^d#;OXzcvHHz(`nV*`40SZn{LLEKk@4YLxOYu?vYx!V z)90{djZYdUDZcl;N)KIFL ze#v|8fjSF@2UXC-;^~4AjmMG`TZIK%$T#k)30CLCNIW!}RN}FMHla+(1%Z{Ef`CV3 z)74F9&B2uDQ0ax&nDuVD^#QI?htN zh(0XytXV2f8Rw0w7I)s_UhG@yU20hw7+dj#u3021Rp&i@c;WDBZAZSg_2+7c681_nXYZC&OqK7m=o8kJg27Trw8Y>u-ve?f1&rx?xm8my~_jn=H9%smx?%j z8_VL^;POxN&B44gI44qh@3zH>*Xowq@}AvurME@SY9|xk=Eqh%10PxTUH?A+@X@Vk9m4M+TW1uw-z}$iJyT>OMG_QKX?9-P(?bGJ```&}- zlbj}a2_ZZAps#KSN~vmLYjYOdUSJ#rU>2f4L329GVJM84y*6lv7{Elf^*1%{6&#;S zx>CV@$K5A5?(F036axXlp{jtOzntLyD5@vd`*%ES19cV()EBG(u-gd(#qOM0coL?Y sR_}^E(YTa~$U*!xWk8!w>?FejuIk#4x!oUgyS~ysDk8_{93WHsH>(+kt^fc4 delta 1844 zcmZWpX>1cm6rNdo*H>)kavaBw$=lvN9_CJ&^c}C(7dY|>+|6;**WgSNI{Av?aH{v-53dI4^pgW zkYc+eKs-X@wX>pZpZ{R89K<>7aI+~=3s6Vj6f(G`ESY{1a4r2^T!%f>D@Ab=9hGG4 zrFm%t*O#wIuM1{BOQ5y>MtZ__)WNe`VTmC9+SWc6U}i;}NNW?%5)Vv=03?78fOddR z2C|7Xv7zEta)oR z&!qL_F+EGRLhLqx?EwGh76SXQUOo``7vnfR5cCOuVtP8VLD0?gqBGE?;N@#B;UYd^ zWs9u(NN96c8qb2)js&h>MYsPik z*c4Zqp*9HEOcy)D@dak)5i9W&x@T^-`M&qHzUzO>f5#WS?Tdc2=Hs;sYj4G$`OWO5VuY{=B>cE9L9*R~CVc(u>incsEVJ^*$6+cXeAkGc%4RCW#GD*K1 z=*5fW`mJu!ISN6X6q701J$MQ~M?W0AHokJAg!6NTY7t4uItswcX#=ZT6BnCcRKocM z=3m}%3ysHG=np&B;~Qmn;tIx%^u|zdq#2f2wN<|2W^llL8dQ^D2(+ECC3pY` zfP?l9haYPZefK9tm*{yAii^Gn3Bkj#yIb@bDG(^v(UZd&9Hf5?M|RgkI^WYVu=v$Y xfW=k97cao?3gJK2ZJC@hlU8?-B6C3V=4G1N74XEqMeF}I=PcNF9|7{5{{T6GfQ0}6 diff --git a/page_objects/__pycache__/screenshot_page.cpython-312.pyc b/page_objects/__pycache__/screenshot_page.cpython-312.pyc index 254efe3f9573df7445337a992d2e8073abd8bf91..858362c932f2178cccd8e7ac720c01df090daf7c 100644 GIT binary patch delta 8620 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 ZX(1N=&Is8o`ES`tO**3cPC(=f{U7|jsKo#P diff --git a/page_objects/__pycache__/upload_config_page.cpython-312.pyc b/page_objects/__pycache__/upload_config_page.cpython-312.pyc index 1ab2c639a69c845b748762883478f6c64e23a4e6..e75af5fc78f842181d39ae6422fefa0d99a08152 100644 GIT binary patch delta 306 zcmV-20nPsY?gaks1P;p$4GI7N000s>jcNB}u?~170Zo&KB&7i)lPx8c0R*$dCE5uA z%d?&@rU?NMvqd?=2?0d22t(-w0gAKoNKFI*p|e0u@&f_Bvold31OeN#R8II~3IH3k7?vwG(j2mzI|lJ8Xn0nW4N z^Ee3s-?Jh8HwXb4w^;=N$OZ;H1^@taI+tDr0U5VI3;|gM0bjS85do+M0jIY^7y*_7 z0eQFD8UauR0n4{5AOR8%0o}JgE&JF`ULH3k7_vwG(j2mzS0lJ8Xn0nxMQ z^Ee3s;= max_retry_attempts: + self.logger.error(f"断点 {item} 经过 {max_retry_attempts} 次重试后仍然失败") + + # 重新获取当前页面项目,因为可能有新的项目加载 + break + # 向下滑动列表以加载更多项目 + if not self.scroll_list(direction="down"): + self.logger.error("向下滑动列表失败") + break + + # 检查是否到达底部:连续两次获取的项目相同 + if current_items == previous_items and len(current_items) > 0: + self.logger.info("连续两次获取的项目相同,已到达列表底部") + break - # 4. 点击平差处理按钮 - if not self.click_adjustment_button(device_id): - self.logger.error(f"设备 {device_id} 点击平差处理按钮失败") - continue + # 更新前一次项目集合 + previous_items = current_items.copy() - # 检查是否在测量页面,在就重新执行选择断点,滑动列表到底部,点击最后一个spinner, 再下滑一次,点击平差处理按钮平差 - if not self.handle_back_navigation(breakpoint_name, device_id): - self.logger.error(f"{breakpoint_name}平差失败,未截图") - continue - - - # 检测并处理"是 保留成果"弹窗 - if not self.handle_adjustment_result_dialog(): - self.logger.error("处理平差结果弹窗失败") - continue - - # # 平差完成,将断点数据保存到上传列表中 - # if not self.add_breakpoint_to_upload_list(breakpoint_name, line_code): - # self.logger.error(f"设备 {device_id} 保存断点 {breakpoint_name} 到上传列表失败") - # continue - - # # 检查是否在测量页面,在就重新执行选择断点,滑动列表到底部,点击最后一个spinner, 再下滑一次,点击平差处理按钮平差 - # if not self.handle_back_navigation(breakpoint_name, device_id): - # self.logger.error(f"{breakpoint_name}平差失败,未截图") - # continue - - # # 检测并处理"是 保留成果"弹窗 - # if not self.handle_adjustment_result_dialog(): - # self.logger.error("处理平差结果弹窗失败") - # continue - - - # 点击返回按钮并处理弹窗 - if not self.execute_back_navigation_steps(device_id): - self.logger.error(f"设备 {device_id} 处理返回按钮确认失败") - continue - - # # 成功处理完一个断点,添加到已处理列表 - # processed_breakpoints.append(breakpoint_name) - # self.logger.info(f"成功处理断点: {breakpoint_name}") - - # # 检查是否所有断点都处理完成 - # if len(processed_breakpoints) == len(breakpoint_names): - # self.logger.info(f"设备 {device_id} 平差页面操作执行完成") - # return True - # else: - # self.logger.warning(f"设备 {device_id} 部分断点处理失败,已成功处理 {len(processed_breakpoints)}/{len(breakpoint_names)} 个断点") - # return True - self.logger.warning(f"设备 {device_id} 平差线路到上传页面流程执行完成") - return True + scroll_count += 1 + self.logger.info(f"第 {scroll_count} 次向下滑动,继续查找...") + + # 检查是否所有断点都处理完成 + if len(processed_breakpoints) == len(breakpoint_names): + self.logger.info(f"设备 {device_id} 平差页面操作执行完成") + return True + elif found_any: + self.logger.warning(f"设备 {device_id} 部分断点处理完成,已成功处理 {len(processed_breakpoints)}/{len(breakpoint_names)} 个断点") + return True + else: + self.logger.warning(f"设备 {device_id} 未找到任何目标断点") + return True except Exception as e: retry_count += 1 diff --git a/scheduler.py b/scheduler.py index 243acd5..05bc038 100644 --- a/scheduler.py +++ b/scheduler.py @@ -152,23 +152,28 @@ def get_combined_tasks(): def run_task(address, target_time, username): """ - 单个执行线程:锁定状态 -> 等待 -> 执行 -> 完成 + 单个执行线程:检查时间 -> 锁定状态 -> 执行 -> 完成 """ - # 1. 尝试将状态从 ok 改为 running (锁定任务) - # 如果此时文件状态已被其他逻辑修改,则放弃执行,防止重复 - if not update_file_status(username, "ok", "running"): - return f"⏭️ {username} 状态已变更,跳过执行。" - - print(f"🚀 [任务锁定] 设备: {address} | 用户: {username} | 计划时间: {target_time}") + print(f"📅 [任务检查] 设备: {address} | 用户: {username} | 计划时间: {target_time}") try: - # 2. 计算并执行等待逻辑 + # 1. 检查当前时间是否到达计划时间 target_dt = datetime.strptime(target_time, "%Y-%m-%d %H:%M:%S") - wait_secs = (target_dt - datetime.now()).total_seconds() + current_dt = datetime.now() - if wait_secs > 0: - print(f"⏳ {username} 距离执行还有 {int(wait_secs)} 秒...") - time.sleep(wait_secs) + # 如果当前时间还未到达计划时间,直接返回,等待下次轮询 + if current_dt < target_dt: + time_diff = int((target_dt - current_dt).total_seconds()) + print(f"⏰ {username} 计划时间未到,距离执行还有 {time_diff} 秒,等待下次轮询") + return f"⏰ {username} 计划时间未到,等待下次轮询" + + # 2. 开始执行前,尝试将状态从 ok 改为 running (锁定任务) + # 如果此时文件状态已被其他逻辑修改,则放弃执行,防止重复 + print(f"🔒 [准备锁定] 尝试锁定任务状态: {username}") + if not update_file_status(username, "ok", "running"): + return f"⏭️ {username} 状态已变更,跳过执行。" + + print(f"🚀 [任务锁定] 设备: {address} | 用户: {username} | 计划时间: {target_time}") # 3. 调用 main.py 中的自动化逻辑 print(f"▶️ [正在执行] {username} 开始自动化操作...") @@ -181,7 +186,11 @@ def run_task(address, target_time, username): except Exception as e: # 如果中间报错,将状态改为 error 方便排查 - update_file_status(username, "running", "error") + # 只有在状态已经改为 running 的情况下才需要改为 error + try: + update_file_status(username, "running", "error") + except: + pass return f"❌ {username} 执行异常: {str(e)}" def monitor_center(): diff --git a/test_results/上传失败的断点.txt b/test_results/上传失败的断点.txt index f31bda5..470c0f4 100644 --- a/test_results/上传失败的断点.txt +++ b/test_results/上传失败的断点.txt @@ -1,4 +1 @@ -CZSCZQ-13A-二工区-沙马大桥-1#墩身-山区 -CZSCZQ-13A-二工区-沙马大桥-2#墩身-山区 -CZSCZQ-13A-二工区-沙马大桥-6#墩-山区 -CZSCZQ-13A-二工区-沙马大桥-7#墩-山区 +SJSG-7标-跨沿江高速特大桥-85#-89#-墩身-平原