python-qlv-helper 0.6.0__py3-none-any.whl → 0.9.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python_qlv_helper
3
- Version: 0.6.0
3
+ Version: 0.9.3
4
4
  Summary: qlv helper python package
5
5
  Author-email: ckf10000 <ckf10000@sina.com>
6
6
  License: Apache License
@@ -210,14 +210,16 @@ Project-URL: Issues, https://github.com/ckf10000/qlv-helper/issues
210
210
  Requires-Python: >=3.12
211
211
  Description-Content-Type: text/markdown
212
212
  License-File: LICENSE
213
- Requires-Dist: playwright==1.56.0; python_version >= "3.12" and platform_system == "Windows"
214
- Requires-Dist: playwright-stealth==2.0.0; python_version >= "3.12" and platform_system == "Windows"
215
- Requires-Dist: ddddocr==1.5.6; python_version >= "3.12" and platform_system == "Windows"
213
+ Requires-Dist: playwright==1.56.0; python_version >= "3.12"
214
+ Requires-Dist: playwright-stealth==2.0.0; python_version >= "3.12"
215
+ Requires-Dist: ddddocr==1.5.6; python_version >= "3.12"
216
216
  Requires-Dist: aiohttp==3.13.2; python_version >= "3.12"
217
217
  Requires-Dist: beautifulsoup4==4.14.2; python_version >= "3.12"
218
- Requires-Dist: airtest==1.3.6; python_version >= "3.12" and platform_system == "Windows"
219
- Requires-Dist: python_http_helper>=0.2.0; python_version >= "3.12"
220
- Requires-Dist: python_playwright_helper>=0.2.9; python_version >= "3.12"
218
+ Requires-Dist: airtest==1.3.6; python_version >= "3.12"
219
+ Requires-Dist: python_http_helper>=0.2.1; python_version >= "3.12"
220
+ Requires-Dist: python_playwright_helper>=0.4.3; python_version >= "3.12"
221
+ Requires-Dist: python_ocr_helper>=0.0.2; python_version >= "3.12"
222
+ Requires-Dist: flight_helper>=0.3.6
221
223
  Dynamic: license-file
222
224
 
223
225
  # qlv-helper
@@ -1,35 +1,36 @@
1
- python_qlv_helper-0.6.0.dist-info/licenses/LICENSE,sha256=WtjCEwlcVzkh1ziO35P2qfVEkLjr87Flro7xlHz3CEY,11556
1
+ python_qlv_helper-0.9.3.dist-info/licenses/LICENSE,sha256=WtjCEwlcVzkh1ziO35P2qfVEkLjr87Flro7xlHz3CEY,11556
2
2
  qlv_helper/__init__.py,sha256=5DCc5JhfdsgtIuFWgkxPOW5VVKZ8RPikQLGIuyZX6_Y,465
3
3
  qlv_helper/config/__init__.py,sha256=0pKLgui-sC6yMNBBuuTTLkUGhPybiJQSTKTbi66alvg,465
4
4
  qlv_helper/config/custom_exception.py,sha256=uYme0iseQt_dP-Y6-hZ_H2OA2OQR0Kp5PmmZvhEZlEc,805
5
- qlv_helper/config/url_const.py,sha256=PbKKKH4heqP6SO186MTt-CEpf-Ix5ODlLQ2Aq2ZBZhU,537
5
+ qlv_helper/config/url_const.py,sha256=EoLHOtlO3Ob2WSMMv6TBrl7eJCfJCB844dwmD_k86BM,630
6
6
  qlv_helper/controller/__init__.py,sha256=cOJA0xMIytv17oICzPYqWLaSy-Ro2Ceeti0hHhsUj6Y,468
7
7
  qlv_helper/controller/domestic_activity_order.py,sha256=MlmsDVsMBWq2h4Yjh1rhO372Z3p8tu2-4IZGP-nkfr8,1136
8
- qlv_helper/controller/main_page.py,sha256=JtkB6BdKYHoNYZ4fkeALpSmAj-NAuiv1x6BvCcBtpic,1252
9
- qlv_helper/controller/order_detail.py,sha256=PjBS1YmiRzWaXg0brJef96k0-0uLr6oaEYz5zZzpjoo,22675
10
- qlv_helper/controller/order_table.py,sha256=4AgA9EO0_GVuwnW3ltXPoN74U_6YpOqkRJVdeLb6L1o,6082
11
- qlv_helper/controller/user_login.py,sha256=iyyDbOREsXtV5bqAFeXGwurvcCmDHmquh6ReWCfnOBE,5281
8
+ qlv_helper/controller/main_page.py,sha256=p_-nXAIptNrx1SUgma7oPB-cqFFHYdCNvXCfsesIQFc,1855
9
+ qlv_helper/controller/order_detail.py,sha256=bDmA_v0CummPlKKfxTry6-SaH6qfZ4LekqnK38Rq2CA,22114
10
+ qlv_helper/controller/order_table.py,sha256=bVVCM2oJF4q43fdJN5aBYbpwzW2rcL0bMoCP90ZIvtY,15144
11
+ qlv_helper/controller/user_login.py,sha256=oXO1otTGuK3_r07fKdncQE3Is2w-kiI-mWmJyFvsVyE,5915
12
+ qlv_helper/controller/wechat_login.py,sha256=0u9H6tJiQO28nT5AG2Ot7EWFmpBqFJD_9dd12snsJIQ,2196
12
13
  qlv_helper/http/__init__.py,sha256=yDh1xi_o7ohXqDAzLu62qCWIGk4_aD1dhnUaCon3klM,484
13
14
  qlv_helper/http/main_page.py,sha256=LTpwrG8H_NqwCa3185irgcGd6JQkChAk7HQsDM-TNTI,1519
14
- qlv_helper/http/order_page.py,sha256=uhCnRPvIvSg5ACMCfpw5_Z62iAAw-Dm-yDRloe5QBP8,16934
15
+ qlv_helper/http/order_page.py,sha256=aaghRwvC2Px5OgQh8Lc4-Q1eQWbXE-lYM2iLdm7qbSw,24987
15
16
  qlv_helper/http/order_table_page.py,sha256=IaXn5wjqPi1aRXHz0kucdHEdZswUWAZfECC13y57y8k,14440
16
17
  qlv_helper/po/__init__.py,sha256=eDr06o0eYapBsYpOhA11bbxzs2F0dsuDjOKmxk_2HVE,480
17
- qlv_helper/po/domestic_activity_order_page.py,sha256=f-XSc2HD6GYisUJZwK2-u0Tr4W3B_vb5JpXvHnjfHOQ,5030
18
- qlv_helper/po/login_page.py,sha256=HKGjS4WrkWnDdnh0JQAYxA3DyEWbInviQTna_KrP2FA,5960
19
- qlv_helper/po/main_page.py,sha256=Hf8Wj7D9GitIj4HIi_zDHHIc5kasFQwraqEMZObYI7w,3320
20
- qlv_helper/po/order_detail_page.py,sha256=zCB-pWyXdZz8vlDhvl1K79-bQ7C7Y12DiDSXlS_woYw,13681
18
+ qlv_helper/po/domestic_activity_order_page.py,sha256=El63U0GI2PU9WGIkGxPgCE1Fp1yCsw2v1H6cZhSaG4c,8509
19
+ qlv_helper/po/login_page.py,sha256=JbapNFwGCei3K3mpfhte1TVNeqzG7yHsCtp5KiKv_6g,4271
20
+ qlv_helper/po/main_page.py,sha256=0_tqZILZnLS6y3chg9ERTHDtg86pW0aIQ1vNuPFLVG8,1752
21
+ qlv_helper/po/order_detail_page.py,sha256=f3PZF1Sm5Xdc9qRQDDKSq08L6PM-o4Vkchu32sZytfA,15545
21
22
  qlv_helper/po/wechat_auth_page.py,sha256=a4YZlM5JOS0l3CNJm_oJFBhZY7AbNOpdIwilSjAO5bY,3171
22
23
  qlv_helper/utils/__init__.py,sha256=rGzBkUf1tslG4WRPQjVWTVuwWG76pkckuKO_6K4sEus,465
23
24
  qlv_helper/utils/browser_utils.py,sha256=mKoqSEz1vFrVemp9cgI4R5UhA4k7i0Cd9cWsIXJZ6E4,986
24
25
  qlv_helper/utils/datetime_utils.py,sha256=BaDJKuH-yqc2NF9KYN66zUYUEJ9ZRHj09AV4-gILf3o,606
25
26
  qlv_helper/utils/file_handle.py,sha256=_dJ9Yk8esttJYsjdBMZAkjZTDQh5QYVPXjLRRyWUMh0,1087
26
27
  qlv_helper/utils/html_utils.py,sha256=i5oOFYETH3kDS9-rSyGu1SHFTkfZvAPPQ4za76BCdVA,1962
27
- qlv_helper/utils/ocr_helper.py,sha256=IrS4iPTm1SXnVpbHKMowQA2w1bvI0fUVRqEAbmwnjws,2781
28
+ qlv_helper/utils/ocr_helper.py,sha256=vpIokr07Utmpsb78MHF83UcXL90A8BPbLgjMg4kONyA,3343
28
29
  qlv_helper/utils/po_utils.py,sha256=SwQKL58HERGG2Weou_AwY_TQoYSvgi0gvaVCJBput_k,3516
29
30
  qlv_helper/utils/stealth_browser.py,sha256=srNOYJOboYo30TvW5OP5TaVpg4jgHm9GxqmYnuwcUQU,3140
30
31
  qlv_helper/utils/type_utils.py,sha256=S5FXUje2mbDuq27LU05WymxNu1VGOLBUV3tuqcx51dE,3792
31
32
  qlv_helper/utils/windows_utils.py,sha256=Cvedsk1c2ujgPNVxszz8XWANkvEr8G9kne6povtZRU4,2866
32
- python_qlv_helper-0.6.0.dist-info/METADATA,sha256=cG17GIsXVxDMdh92lqvgtJKpMI4Qn1dNjgtTrQbZMjc,14853
33
- python_qlv_helper-0.6.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
34
- python_qlv_helper-0.6.0.dist-info/top_level.txt,sha256=0pYdhD8SfBcC57LzLYGHY7cwwPqdqAkB1twysCJh5OA,11
35
- python_qlv_helper-0.6.0.dist-info/RECORD,,
33
+ python_qlv_helper-0.9.3.dist-info/METADATA,sha256=GVMfOfy40GcPrKIH_pLtFCW3vzPD6b2sZH-yd4XbnW4,14825
34
+ python_qlv_helper-0.9.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
35
+ python_qlv_helper-0.9.3.dist-info/top_level.txt,sha256=0pYdhD8SfBcC57LzLYGHY7cwwPqdqAkB1twysCJh5OA,11
36
+ python_qlv_helper-0.9.3.dist-info/RECORD,,
@@ -11,3 +11,5 @@
11
11
  """
12
12
 
13
13
  order_detail_url = "/OrderProcessing/NewTicket_show/{}?&r={}"
14
+ domestic_activity_order_url = "/OrderList/GuoNei_ActivityOrders"
15
+ login_url = "/Home/Login"
@@ -10,13 +10,29 @@
10
10
  # ---------------------------------------------------------------------------------------------------------
11
11
  """
12
12
  import aiohttp
13
+ from logging import Logger
14
+ from playwright.async_api import Page
13
15
  from typing import Dict, Any, Optional
16
+ from qlv_helper.po.main_page import MainPage
14
17
  from qlv_helper.http.main_page import get_main_page_html, parser_head_title
15
18
 
16
19
 
20
+ async def open_main_page(
21
+ *, page: Page, logger: Logger, qlv_protocol: str, qlv_domain: str, timeout: float = 60.0, **kwargs: Any
22
+ ) -> MainPage:
23
+ url_prefix = f"{qlv_protocol}://{qlv_domain}"
24
+ main_url = url_prefix + "/"
25
+ await page.goto(main_url)
26
+
27
+ main_po = MainPage(page=page, url=main_url)
28
+ await main_po.url_wait_for(url=main_url, timeout=timeout)
29
+ logger.info(f"即将进入首页,页面URL<{main_url}>")
30
+ return main_po
31
+
32
+
17
33
  async def get_main_info_with_http(
18
34
  domain: str, protocol: str = "http", retry: int = 1, timeout: int = 5, enable_log: bool = True,
19
- cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None
35
+ cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None, **kwargs: Any
20
36
  ) -> Dict[str, Any]:
21
37
  response = await get_main_page_html(
22
38
  domain=domain, protocol=protocol, retry=retry, timeout=timeout, enable_log=enable_log,
@@ -27,4 +43,4 @@ async def get_main_info_with_http(
27
43
 
28
44
  html = response.get("data")
29
45
  response["message"] = parser_head_title(html=html)
30
- return response
46
+ return response
@@ -13,11 +13,19 @@ import aiohttp
13
13
  import asyncio
14
14
  from logging import Logger
15
15
  from datetime import datetime
16
+ from typing import Dict, Any, List, Optional
16
17
  import qlv_helper.config.url_const as url_const
17
- from typing import Dict, Any, List, cast, Optional
18
18
  from qlv_helper.po.order_detail_page import OrderDetailPage
19
+ from flight_helper.utils.exception_utils import UserNotLoginError
20
+ from flight_helper.models.dto.procurement import FillProcurementInputDTO
21
+ from flight_helper.utils.exception_utils import RelationOrderConflictError, LockedOrderFailedError
19
22
  from qlv_helper.http.order_page import parser_order_info, get_order_page_html, parser_order_flight_table, \
20
- fill_procurement_info_with_http
23
+ fill_procurement_dto_with_http as _fill_procurement_dto_with_http, fill_remark_with_http as _fill_remark_with_http, \
24
+ update_policy_with_http as _update_policy_with_http, unlock_order_with_http as _unlock_order_with_http, \
25
+ forced_unlock_order_with_http as _forced_unlock_order_with_http, locked_order_with_http as _locked_order_with_http, \
26
+ fill_itinerary_with_http as _fill_itinerary_with_http, \
27
+ kick_out_activity_order_with_http as _kick_out_activity_order_with_http, \
28
+ kick_out_activity_orders_with_http as _kick_out_activity_orders_with_http
21
29
  from playwright.async_api import Page, Locator, Error as PlaywrightError, TimeoutError as PlaywrightTimeoutError
22
30
 
23
31
 
@@ -56,9 +64,14 @@ async def open_order_detail_page(
56
64
  logger.info(f"即将劲旅订单详情页面,页面URL<{order_detail_url}>")
57
65
 
58
66
  try:
67
+ message: str = await order_detail_po.get_message_content(timeout=1)
68
+ if "关联订单" in message:
69
+ raise RelationOrderConflictError(message)
59
70
  confirm_btn = await order_detail_po.get_message_notice_dialog_confirm_btn(timeout=1)
60
71
  await confirm_btn.click(button="left")
61
72
  logger.info("订单详情页面,消息提醒弹框,【确认】按钮点击完成")
73
+ except (RelationOrderConflictError,):
74
+ raise
62
75
  except (PlaywrightTimeoutError, PlaywrightError, RuntimeError, Exception):
63
76
  pass
64
77
  return order_detail_po
@@ -76,6 +89,58 @@ async def add_custom_remark(*, logger: Logger, page: OrderDetailPage, remark: st
76
89
  logger.info(f"订单详情页面,日志记录栏,【保存备注】按钮点击完成")
77
90
 
78
91
 
92
+ async def add_custom_remark_with_http(
93
+ *, order_id: int, remark: str, domain: str, protocol: str = "http", retry: int = 1, timeout: int = 5,
94
+ enable_log: bool = True, cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None
95
+ ) -> Dict[str, Any]:
96
+ return await _fill_remark_with_http(
97
+ remark=remark, order_id=order_id, qlv_domain=domain, qlv_protocol=protocol, retry=retry, timeout=timeout,
98
+ enable_log=enable_log, cookie_jar=cookie_jar, playwright_state=playwright_state
99
+ )
100
+
101
+
102
+ async def update_order_policy_with_http(
103
+ *, order_id: int, policy_name: str, domain: str, protocol: str = "http", retry: int = 1, timeout: int = 5,
104
+ enable_log: bool = True, cookie_jar: Optional[aiohttp.CookieJar] = None, old_policy_name: Optional[str] = None,
105
+ playwright_state: Dict[str, Any] = None
106
+ ) -> Dict[str, Any]:
107
+ return await _update_policy_with_http(
108
+ policy_name=policy_name, order_id=order_id, qlv_domain=domain, qlv_protocol=protocol, retry=retry,
109
+ timeout=timeout, enable_log=enable_log, cookie_jar=cookie_jar, playwright_state=playwright_state,
110
+ old_policy_name=old_policy_name
111
+ )
112
+
113
+
114
+ async def locked_order_with_http(
115
+ *, order_id: int, domain: str, protocol: str = "http", retry: int = 1, timeout: int = 5,
116
+ enable_log: bool = True, cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None
117
+ ) -> Dict[str, Any]:
118
+ return await _locked_order_with_http(
119
+ order_id=order_id, qlv_domain=domain, qlv_protocol=protocol, retry=retry, timeout=timeout,
120
+ enable_log=enable_log, cookie_jar=cookie_jar, playwright_state=playwright_state
121
+ )
122
+
123
+
124
+ async def unlock_order_with_http(
125
+ *, order_id: int, domain: str, protocol: str = "http", retry: int = 1, timeout: int = 5,
126
+ enable_log: bool = True, cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None
127
+ ) -> Dict[str, Any]:
128
+ return await _unlock_order_with_http(
129
+ order_id=order_id, qlv_domain=domain, qlv_protocol=protocol, retry=retry, timeout=timeout,
130
+ enable_log=enable_log, cookie_jar=cookie_jar, playwright_state=playwright_state
131
+ )
132
+
133
+
134
+ async def forced_unlock_order_with_http(
135
+ *, order_id: int, domain: str, protocol: str = "http", retry: int = 1, timeout: int = 5,
136
+ enable_log: bool = True, cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None
137
+ ) -> Dict[str, Any]:
138
+ return await _forced_unlock_order_with_http(
139
+ order_id=order_id, qlv_domain=domain, qlv_protocol=protocol, retry=retry, timeout=timeout,
140
+ enable_log=enable_log, cookie_jar=cookie_jar, playwright_state=playwright_state
141
+ )
142
+
143
+
79
144
  async def update_order_policy(
80
145
  *, page: OrderDetailPage, logger: Logger, policy: str, order_id: int, timeout: float = 5.0
81
146
  ) -> None:
@@ -92,6 +157,13 @@ async def order_unlock(
92
157
  *, logger: Logger, page: OrderDetailPage, remark: str, order_id: int, is_force: bool = False,
93
158
  qlv_user_id: Optional[str] = None, timeout: float = 5.0
94
159
  ) -> None:
160
+ try:
161
+ confirm_btn = await page.get_message_notice_dialog_confirm_btn(timeout=3)
162
+ await confirm_btn.click(button="left")
163
+ logger.info("订单详情页面,消息提醒弹框,【确认】按钮点击完成")
164
+ await asyncio.sleep(2)
165
+ except (Exception,):
166
+ pass
95
167
  # 1. 获取订单操作锁的状态
96
168
  lock_state, lock_btn = await page.get_order_lock_state_btn(timeout=timeout)
97
169
  if "强制解锁" in lock_state:
@@ -100,7 +172,7 @@ async def order_unlock(
100
172
  await lock_btn.click(button="left")
101
173
  logger.info(f"订单详情页面,用户操作【{lock_state}】按钮点击完成")
102
174
  try:
103
- confirm_btn = await page.get_message_notice_dialog_confirm_btn(timeout=1)
175
+ confirm_btn = await page.get_message_notice_dialog_confirm_btn(timeout=5)
104
176
  await confirm_btn.click(button="left")
105
177
  logger.info("订单详情页面,强制解锁弹框确认,【确认】按钮点击完成")
106
178
  await asyncio.sleep(2)
@@ -114,10 +186,27 @@ async def order_unlock(
114
186
  return
115
187
  elif "操作" in lock_state:
116
188
  await lock_btn.click(button="left")
117
- await asyncio.sleep(2)
118
- lock_state_temp = lock_state
189
+ logger.info(f"订单详情页面,日志记录栏,【{lock_state}】按钮点击完成")
190
+ try:
191
+ confirm_btn = await page.get_message_notice_dialog_confirm_btn(timeout=3)
192
+ await confirm_btn.click(button="left")
193
+ logger.info("订单详情页面,消息提醒弹框,【确认】按钮点击完成")
194
+ await asyncio.sleep(2)
195
+ except (Exception,):
196
+ pass
119
197
  lock_state, lock_btn = await page.get_order_lock_state_btn(timeout=timeout)
120
- logger.info(f"订单详情页面,日志记录栏,【{lock_state_temp}】按钮点击完成")
198
+ logger.info(f"订单详情页面,页面刷新后,【{lock_state}】按钮获取完成")
199
+ if "操作" in lock_state:
200
+ await lock_btn.click(button="left")
201
+ logger.info(f"订单详情页面,日志记录栏,【{lock_state}】按钮点击完成")
202
+ try:
203
+ confirm_btn = await page.get_message_notice_dialog_confirm_btn(timeout=3)
204
+ await confirm_btn.click(button="left")
205
+ logger.info("订单详情页面,消息提醒弹框,【确认】按钮点击完成")
206
+ await asyncio.sleep(2)
207
+ except (Exception,):
208
+ pass
209
+ lock_state, lock_btn = await page.get_order_lock_state_btn(timeout=timeout)
121
210
  if remark:
122
211
  # 2. 添加解锁备注
123
212
  await add_custom_remark(logger=logger, page=page, remark=remark, timeout=timeout)
@@ -154,11 +243,19 @@ async def order_locked(
154
243
  # 2. 点击【锁定|操作】按钮
155
244
  await lock_btn.click(button="left")
156
245
  logger.info(f"订单详情页面,日志记录栏,【{lock_state}】按钮点击完成")
246
+ try:
247
+ confirm_btn = await page.get_message_notice_dialog_confirm_btn(timeout=1)
248
+ await confirm_btn.click(button="left")
249
+ logger.info("订单详情页面,强制解锁弹框确认,【确认】按钮点击完成")
250
+ await asyncio.sleep(2)
251
+ except (PlaywrightTimeoutError, PlaywrightError, RuntimeError, Exception):
252
+ pass
157
253
 
158
254
 
159
255
  async def first_open_page_order_locked(
160
256
  *, logger: Logger, page: Page, protocol: str, domain: str, order_id: int, is_force: bool = False,
161
- qlv_user_id: Optional[str] = None, timeout: float = 5.0, **kwargs
257
+ qlv_user_id: Optional[str] = None, timeout: float = 5.0, retry: int = 1, enable_log: bool = True,
258
+ cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None, **kwargs
162
259
  ) -> OrderDetailPage:
163
260
  # 1. 打开页面
164
261
  order_detail_po = await open_order_detail_page(
@@ -166,141 +263,30 @@ async def first_open_page_order_locked(
166
263
  )
167
264
 
168
265
  # 2. 锁定订单
169
- await order_locked(
170
- logger=logger, page=order_detail_po, order_id=order_id, timeout=timeout, is_force=is_force,
171
- qlv_user_id=qlv_user_id
172
- )
173
- return order_detail_po
174
-
175
-
176
- async def first_open_page_order_unlock(
177
- *, logger: Logger, page: Page, protocol: str, domain: str, order_id: int, is_force: bool = False,
178
- qlv_user_id: Optional[str] = None, timeout: float = 5.0, remark: Optional[str] = None, **kwargs
179
- ) -> OrderDetailPage:
180
- # 1. 打开页面
181
- order_detail_po = await open_order_detail_page(
182
- page=page, logger=logger, protocol=protocol, domain=domain, order_id=order_id, timeout=timeout
183
- )
184
-
185
- # 2. 解锁订单
186
- await order_unlock(
187
- logger=logger, page=order_detail_po, order_id=order_id, timeout=timeout, is_force=is_force,
188
- qlv_user_id=qlv_user_id, remark=remark
189
- )
190
- return order_detail_po
191
-
192
-
193
- async def fill_procurement_info(
194
- *, logger: Logger, page: OrderDetailPage, order_id: int, out_ticket_platform_type: str, purchase_amount: float,
195
- out_ticket_platform: str, out_ticket_account: str, purchase_account_type: str, purchase_account: str,
196
- ceair_user_id: str, ceair_password: str, payment_id: str, platform_order_id: str, timeout: float = 5.0
197
- ) -> None:
198
- # 1. 出票地类型选择【out_ticket_platform_type】
199
- out_ticket_platform_type_dropdown = await page.get_out_ticket_platform_type_dropdown(timeout=timeout)
200
- await out_ticket_platform_type_dropdown.select_option(label=out_ticket_platform_type)
201
- # await out_ticket_platform_type_dropdown.click(button="left")
202
- # out_ticket_platform_type_select_option = await page.get_out_ticket_platform_type_select_option(
203
- # select_option=out_ticket_platform_type, timeout=timeout
204
- # )
205
- # await out_ticket_platform_type_select_option.click(button="left")
206
- logger.info(f"订单详情页面,采购信息栏,出票地类型选择<{out_ticket_platform_type}>已完成")
207
- await asyncio.sleep(1)
208
-
209
- # 2. 出票平台选择【out_ticket_platform】
210
- out_ticket_platform_dropdown = await page.get_out_ticket_platform_dropdown(timeout=timeout)
211
- await out_ticket_platform_dropdown.select_option(label=out_ticket_platform)
212
- # await out_ticket_platform_dropdown.click(button="left")
213
- # out_ticket_platform_select_option = await page.get_out_ticket_platform_select_option(
214
- # select_option=out_ticket_platform, timeout=timeout
215
- # )
216
- # await out_ticket_platform_select_option.click(button="left")
217
- logger.info(f"订单详情页面,采购信息栏,出票平台选择<{out_ticket_platform}>已完成")
218
- await asyncio.sleep(1)
219
-
220
- # 3. 出票账号选择【out_ticket_account】
221
- out_ticket_account_dropdown = await page.get_out_ticket_account_dropdown(timeout=timeout)
222
- await out_ticket_account_dropdown.select_option(label=out_ticket_account)
223
- # await out_ticket_account_dropdown.click(button="left")
224
- # out_ticket_account_select_option = await page.get_out_ticket_account_select_option(
225
- # select_option=out_ticket_account, timeout=timeout
226
- # )
227
- # await out_ticket_account_select_option.click(button="left")
228
- logger.info(f"订单详情页面,采购信息栏,出票账号选择<{out_ticket_account}>已完成")
229
- await asyncio.sleep(1)
230
-
231
- # 4. 采购账号类型选择【purchase_account_type】
232
- purchase_account_type_dropdown = await page.get_purchase_account_type_dropdown(timeout=timeout)
233
- await purchase_account_type_dropdown.select_option(label=purchase_account_type)
234
- # await purchase_account_type_dropdown.click(button="left")
235
- # purchase_account_type_select_option = await page.get_purchase_account_type_select_option(
236
- # select_option=purchase_account_type, timeout=timeout
266
+ # await order_locked(
267
+ # logger=logger, page=order_detail_po, order_id=order_id, timeout=timeout, is_force=is_force,
268
+ # qlv_user_id=qlv_user_id
237
269
  # )
238
- # await purchase_account_type_select_option.click(button="left")
239
- logger.info(f"订单详情页面,采购信息栏,采购账号类型选择<{purchase_account_type}>已完成")
240
- await asyncio.sleep(1)
241
-
242
- # 5. 采购账号选择【purchase_account】
243
- purchase_account_dropdown = await page.get_purchase_account_dropdown(timeout=timeout)
244
- await purchase_account_dropdown.select_option(label=purchase_account)
245
- # await purchase_account_dropdown.click(button="left")
246
- # purchase_account_select_option = await page.get_purchase_account_select_option(
247
- # select_option=purchase_account, timeout=timeout
248
- # )
249
- # await purchase_account_select_option.click(button="left")
250
- logger.info(f"订单详情页面,采购信息栏,采购账号选择<{purchase_account}>已完成")
251
- await asyncio.sleep(1)
252
-
253
- # 6. 填写采购金额
254
- purchase_amount_input = await page.get_purchase_amount_input(timeout=timeout)
255
- await purchase_amount_input.fill(value=str(purchase_amount))
256
- logger.info(f"订单详情页面,采购信息栏,采购金额<{purchase_amount}>输入完成")
257
-
258
- # 7. 填写备注
259
- remark_input = await page.get_remark_input(timeout=timeout)
260
- value = f"{ceair_user_id}/{ceair_password}"
261
- await remark_input.fill(value=value)
262
- logger.info(f"订单详情页面,采购信息栏,备注<{value}>输入完成")
263
-
264
- # 8. 填写对账标识
265
- main_check_input = await page.get_main_check_input(timeout=timeout)
266
- await main_check_input.fill(value=payment_id)
267
- logger.info(f"订单详情页面,采购信息栏,对账标识<{payment_id}>输入完成")
268
-
269
- # 9. 填写官网订单号
270
- air_comp_order_id_input = await page.get_air_comp_order_id_input(timeout=timeout)
271
- await air_comp_order_id_input.fill(value=platform_order_id)
272
- logger.info(f"订单详情页面,采购信息栏,官网订单号<{platform_order_id}>输入完成")
273
-
274
- # 10. 点击【保存采购】按钮
275
- procurement_info_save_btn = await page.get_procurement_info_save_btn(timeout=timeout)
276
- await procurement_info_save_btn.click(button="left")
277
- logger.info(f"订单详情页面,采购信息栏,【保存采购】按钮点击完成")
278
-
279
-
280
- async def first_open_page_fill_procurement_info(
281
- *, logger: Logger, page: Page, order_id: int, protocol: str, domain: str, out_ticket_platform_type: str,
282
- purchase_amount: float, out_ticket_platform: str, out_ticket_account: str, purchase_account_type: str,
283
- purchase_account: str, ceair_user_id: str, ceair_password: str, payment_id: str, platform_order_id: str,
284
- is_force: bool = False, qlv_user_id: Optional[str] = None, timeout: float = 5.0, **kwargs: Any
285
- ) -> OrderDetailPage:
286
- # 1. 打开页面
287
- order_detail_po = await open_order_detail_page(
288
- page=page, logger=logger, protocol=protocol, domain=domain, order_id=order_id, timeout=timeout
289
- )
290
-
291
- # 2. 锁定订单
292
- await order_locked(
293
- logger=logger, page=order_detail_po, order_id=order_id, is_force=is_force, timeout=timeout,
294
- qlv_user_id=qlv_user_id
295
- )
296
-
297
- # 3. 回填采购信息
298
- await fill_procurement_info(
299
- out_ticket_platform_type=out_ticket_platform_type, out_ticket_account=out_ticket_account, payment_id=payment_id,
300
- purchase_amount=purchase_amount, out_ticket_platform=out_ticket_platform, purchase_account=purchase_account,
301
- purchase_account_type=purchase_account_type, ceair_user_id=ceair_user_id, ceair_password=ceair_password,
302
- platform_order_id=platform_order_id, timeout=timeout, logger=logger, page=order_detail_po, order_id=order_id
270
+ response = await _locked_order_with_http(
271
+ order_id=order_id, qlv_domain=domain, qlv_protocol=protocol, retry=retry, timeout=int(timeout),
272
+ enable_log=enable_log, cookie_jar=cookie_jar, playwright_state=playwright_state
303
273
  )
274
+ message = response.get("message")
275
+ if message == "订单出票":
276
+ logger.info(f"订单<{order_id}>,被用户<{qlv_user_id}>锁单成功")
277
+ else:
278
+ msg: str = "锁单失败"
279
+ if message == "强旅系统":
280
+ if response.get("data").find("用户登陆") != -1:
281
+ raise UserNotLoginError(f"{msg},用户<{qlv_user_id}>未登录劲旅系统")
282
+ else:
283
+ msg = msg + "," + response.get("data") if len(
284
+ response.get("data")
285
+ ) < 100 else response.get("data")[:100]
286
+ raise RuntimeError(msg)
287
+ elif message == "操作提示":
288
+ msg = msg + f",原因:{response.get('data')}"
289
+ raise LockedOrderFailedError(msg)
304
290
  return order_detail_po
305
291
 
306
292
 
@@ -320,26 +306,23 @@ async def fill_itinerary(
320
306
  raise RuntimeError(
321
307
  f"传递回填票号的乘客证件信息<{kwargs_passengers}>与订单实际乘客信息<{current_passengers}>不一致"
322
308
  )
323
- passenger_itinerary_locator = cast(Locator, None)
324
309
  for passenger_locator in passenger_itinerary_locators:
325
310
  current_passenger = passenger_locator.get("username")
326
311
  passenger_itinerary = passengers_itinerary.get(current_passenger)
327
312
  if passenger_itinerary:
328
313
  passenger_itinerary_locator: Locator = passenger_locator.get("locator")
329
314
  await passenger_itinerary_locator.fill(value=passenger_itinerary)
315
+ await passenger_itinerary_locator.press("Enter")
330
316
  logger.info(f"订单<{order_id}>,乘客<{current_passenger}>的票号<{passenger_itinerary}>填写完成")
317
+ await asyncio.sleep(1)
331
318
  else:
332
319
  logger.warning(f"订单<{order_id}>,乘客<{current_passenger}>的票号没有获取到,本次回填跳过,等待下一次")
333
- if passenger_itinerary_locator:
334
- await passenger_itinerary_locator.press("Enter")
335
- logger.info(f"订单<{order_id}>,本次的票号回填完成")
336
- else:
337
- raise RuntimeError(f"回填票号过程异常,回填失败")
338
320
 
339
321
 
340
322
  async def first_open_page_fill_itinerary(
341
- *, page: Page, logger: Logger, protocol: str, domain: str, order_id: int,
342
- passengers_itinerary: Dict[str, Any], timeout: float = 20.0, **kwargs: Any
323
+ *, page: Page, logger: Logger, protocol: str, domain: str, order_id: int, retry: int = 1,
324
+ enable_log: bool = True, passengers_itinerary: Dict[str, Any], timeout: float = 20.0,
325
+ cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None, **kwargs: Any
343
326
  ) -> OrderDetailPage:
344
327
  # 1. 开发页面
345
328
  order_detail_po = await open_order_detail_page(
@@ -352,25 +335,35 @@ async def first_open_page_fill_itinerary(
352
335
  passengers_itinerary=passengers_itinerary
353
336
  )
354
337
  logger.info(f"订单<{order_id}>,票号回填流程结束")
355
- await order_unlock(logger=logger, page=order_detail_po, order_id=order_id, timeout=timeout, remark="")
356
- logger.info(f"订单<{order_id}>,订单解锁成功")
357
- return order_detail_po
358
-
359
-
360
- async def first_open_page_update_policy(
361
- *, page: Page, logger: Logger, protocol: str, domain: str, order_id: int, policy: str, timeout: float = 20.0,
362
- **kwargs: Any
363
- ) -> OrderDetailPage:
364
- # 1. 打开页面
365
- order_detail_po = await open_order_detail_page(
366
- page=page, logger=logger, protocol=protocol, domain=domain, order_id=order_id, timeout=timeout
367
- )
368
-
369
- # 2. 更新订单政策代码
370
- await update_order_policy(
371
- logger=logger, page=order_detail_po, order_id=order_id, timeout=timeout, policy=policy
372
- )
373
338
 
339
+ # 3. 解锁订单
340
+ # await order_unlock(
341
+ # logger=logger, page=order_detail_po, order_id=order_id, timeout=timeout, is_force=True, remark=""
342
+ # )
343
+ msg: str = f"订单<{order_id}>,"
344
+ try:
345
+ response = await forced_unlock_order_with_http(
346
+ retry=retry, timeout=int(timeout), enable_log=enable_log, cookie_jar=cookie_jar,
347
+ playwright_state=playwright_state, order_id=order_id, domain=domain, protocol=protocol
348
+ )
349
+ if response.get("data") == "1":
350
+ logger.info(f"{msg}强制解锁成功")
351
+ except Exception as e:
352
+ logger.error(f"{msg}强制解锁失败,原因:{e}")
353
+ try:
354
+ response = await unlock_order_with_http(
355
+ retry=retry, timeout=int(timeout), enable_log=enable_log, cookie_jar=cookie_jar,
356
+ playwright_state=playwright_state, order_id=order_id, domain=domain, protocol=protocol
357
+ )
358
+ if response.get("data") == "OK":
359
+ logger.info(f"{msg}解锁成功")
360
+ else:
361
+ if response.get('data'):
362
+ logger.error(f"{msg}解锁失败,原因:{response.get('data')}")
363
+ else:
364
+ logger.error(f"{msg}解锁失败,原因:{response}")
365
+ except Exception as e:
366
+ logger.error(f"{msg}解锁失败,原因:{e}")
374
367
  return order_detail_po
375
368
 
376
369
 
@@ -378,7 +371,7 @@ async def first_open_page_my_order_unlock(
378
371
  *, page: Page, logger: Logger, protocol: str, domain: str, order_id: int, qlv_user_id: str,
379
372
  policy: Optional[str] = None, remark: Optional[str] = None, timeout: float = 20.0, is_force: bool = False,
380
373
  **kwargs: Any
381
- ) -> OrderDetailPage:
374
+ ) -> None:
382
375
  # 1. 打开页面
383
376
  order_detail_po = await open_order_detail_page(
384
377
  page=page, logger=logger, protocol=protocol, domain=domain, order_id=order_id, timeout=timeout
@@ -390,54 +383,51 @@ async def first_open_page_my_order_unlock(
390
383
  logger=logger, page=order_detail_po, order_id=order_id, timeout=timeout, policy=policy
391
384
  )
392
385
 
393
- if remark:
394
- # 3. 添加解锁备注
395
- await add_custom_remark(logger=logger, page=order_detail_po, remark=remark, timeout=timeout)
386
+ # 3. 获取订单操作锁的状态
387
+ await order_unlock(
388
+ logger=logger, page=order_detail_po, remark=remark, order_id=order_id, is_force=is_force,
389
+ qlv_user_id=qlv_user_id, timeout=timeout
390
+ )
396
391
 
397
- # 4. 获取订单操作锁的状态
398
- lock_state, lock_btn = await order_detail_po.get_order_lock_state_btn(timeout=timeout)
399
- if "强制解锁" in lock_state:
400
- if is_force is False:
401
- logger.warning(f"订单<{order_id}>,非本账号<{qlv_user_id}>的锁单,暂不处理,即将跳过")
402
- return order_detail_po
403
- await lock_btn.click(button="left")
404
- logger.info(f"订单详情页面,用户操作【{lock_state}】按钮点击完成")
405
- try:
406
- confirm_btn = await order_detail_po.get_message_notice_dialog_confirm_btn(timeout=1)
407
- await confirm_btn.click(button="left")
408
- logger.info("订单详情页面,强制解锁弹框确认,【确认】按钮点击完成")
409
- await asyncio.sleep(2)
410
- except (PlaywrightTimeoutError, PlaywrightError, RuntimeError, Exception):
411
- pass
412
- logger.warning(f"订单<{order_id}>,已被用户<{qlv_user_id or '无记录'}>强制解锁")
413
- # 再次获取订单操作锁的状态
414
- lock_state, lock_btn = await order_detail_po.get_order_lock_state_btn(timeout=timeout)
415
- elif "锁定" in lock_state:
416
- logger.info(f"订单<{order_id}>,处于无锁状态,无需解锁处理")
417
- return order_detail_po
418
- elif "操作" in lock_state:
419
- await lock_btn.click(button="left")
420
- await asyncio.sleep(2)
421
- lock_state_temp = lock_state
422
- lock_state, lock_btn = await order_detail_po.get_order_lock_state_btn(timeout=timeout)
423
- logger.info(f"订单详情页面,日志记录栏,【{lock_state_temp}】按钮点击完成")
424
392
 
425
- # 5. 点击【解锁返回】按钮
426
- await lock_btn.click(button="left")
427
- await asyncio.sleep(2)
428
- logger.info(f"订单详情页面,日志记录栏,【{lock_state}】按钮点击完成")
429
- return order_detail_po
393
+ async def fill_procurement_with_http_callback(
394
+ *, fill_procurement_dto: FillProcurementInputDTO, retry: int = 1, timeout: int = 5, enable_log: bool = True,
395
+ cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None,
396
+ data_list: Optional[List[Dict[str, Any]]] = None, **kwargs: Any
397
+ ) -> Dict[str, Any]:
398
+ return await _fill_procurement_dto_with_http(
399
+ fill_procurement_dto=fill_procurement_dto, retry=retry, timeout=timeout, enable_log=enable_log,
400
+ cookie_jar=cookie_jar, playwright_state=playwright_state, data_list=data_list
401
+ )
430
402
 
431
403
 
432
- async def fill_procurement_with_http(
433
- *, order_id: int, qlv_domain: str, amount: float, pre_order_id: str, platform_user_id: str, user_password: str,
434
- passengers: List[str], fids: str, pids: List[str], transaction_id: str, qlv_protocol: str = "http",
435
- retry: int = 1, timeout: int = 5, enable_log: bool = True, cookie_jar: Optional[aiohttp.CookieJar] = None,
436
- playwright_state: Dict[str, Any] = None, data_list: Optional[List[Dict[str, Any]]] = None
404
+ async def fill_itinerary_with_http(
405
+ *, order_id: int, qlv_domain: str, pid: str, tid: str, transaction_id: str, itinerary_id: str, retry: int = 1,
406
+ qlv_protocol: str = "http", timeout: int = 5, enable_log: bool = True, data: Optional[str] = None,
407
+ cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None, **kwargs: Any
437
408
  ) -> Dict[str, Any]:
438
- return await fill_procurement_info_with_http(
439
- order_id=order_id, qlv_domain=qlv_domain, amount=amount, pre_order_id=pre_order_id,
440
- platform_user_id=platform_user_id, user_password=user_password, passengers=passengers, fids=fids, pids=pids,
441
- transaction_id=transaction_id, qlv_protocol=qlv_protocol, retry=retry, timeout=timeout, enable_log=enable_log,
442
- cookie_jar=cookie_jar, playwright_state=playwright_state, data_list=data_list
409
+ return await _fill_itinerary_with_http(
410
+ order_id=order_id, qlv_domain=qlv_domain, pid=pid, tid=tid, transaction_id=transaction_id, data=data,
411
+ itinerary_id=itinerary_id, retry=retry, qlv_protocol=qlv_protocol, timeout=timeout, enable_log=enable_log,
412
+ cookie_jar=cookie_jar, playwright_state=playwright_state
413
+ )
414
+
415
+
416
+ async def kick_out_activity_order_with_http(
417
+ *, order_id: int, domain: str, protocol: str = "http", retry: int = 1, timeout: int = 5,
418
+ enable_log: bool = True, cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None
419
+ ) -> Dict[str, Any]:
420
+ return await _kick_out_activity_order_with_http(
421
+ order_id=order_id, qlv_domain=domain, qlv_protocol=protocol, retry=retry, timeout=timeout,
422
+ enable_log=enable_log, cookie_jar=cookie_jar, playwright_state=playwright_state
423
+ )
424
+
425
+
426
+ async def kick_out_activity_orders_with_http(
427
+ *, order_ids: List[int], domain: str, protocol: str = "http", retry: int = 1, timeout: int = 5,
428
+ enable_log: bool = True, cookie_jar: Optional[aiohttp.CookieJar] = None, playwright_state: Dict[str, Any] = None
429
+ ) -> Dict[str, Any]:
430
+ return await _kick_out_activity_orders_with_http(
431
+ order_ids=order_ids, qlv_domain=domain, qlv_protocol=protocol, retry=retry, timeout=timeout,
432
+ enable_log=enable_log, cookie_jar=cookie_jar, playwright_state=playwright_state
443
433
  )