ey-commerce-lib 1.0.3__py3-none-any.whl → 1.0.5__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.

Potentially problematic release.


This version of ey-commerce-lib might be problematic. Click here for more details.

@@ -1,10 +1,11 @@
1
1
  import asyncio
2
2
 
3
3
  from ey_commerce_lib.dxm.constant.order import DxmOrderRuleType
4
- from ey_commerce_lib.dxm.parser.common import get_page_info
4
+ from ey_commerce_lib.dxm.parser.common import get_page_info, get_purchase_pagination_info
5
5
  from ey_commerce_lib.dxm.parser.order import list_order_base_by_html, list_order_rule, get_rule_detail, \
6
6
  get_order_detail_by_html
7
- from ey_commerce_lib.dxm.parser.purchase import list_purchasing_all
7
+ from ey_commerce_lib.dxm.parser.purchase import list_purchasing_all, list_1688_purchase_order_number, \
8
+ list_wait_pay_page_purchase_order_number
8
9
  from ey_commerce_lib.dxm.parser.warehouse import list_warehouse_product
9
10
  from ey_commerce_lib.dxm.schemas.common import Page
10
11
  from ey_commerce_lib.dxm.schemas.order import DxmOrderSearchForm, DxmJsonResponse, DxmCheckProcessResponse, DxmOrderRule
@@ -380,14 +381,173 @@ class DxmClient:
380
381
 
381
382
  async def page_purchasing_all(self, query: PurchasingAllQuery):
382
383
  """
383
- 分页查询采购单
384
+ 分页查询采购单全部
384
385
  :return:
385
386
  """
386
387
  async with self.__sem:
387
388
  page_purchasing_all_pageList_res = await self.__async_client.post(
388
389
  "/dxmPurchasingNote/purchasingAllPageList.htm",
389
390
  data=query.model_dump(by_alias=True))
390
- list_purchasing_all(page_purchasing_all_pageList_res.text)
391
+ page_info = get_purchase_pagination_info(page_purchasing_all_pageList_res.text)
392
+ return {
393
+ **page_info,
394
+ 'data': list_purchasing_all(page_purchasing_all_pageList_res.text)
395
+ }
396
+
397
+ async def list_purchasing_all(self, query: PurchasingAllQuery):
398
+ """
399
+ 查询采购单全部列表
400
+ :param query:
401
+ :return:
402
+ """
403
+ query.page_no = 1
404
+ data = await self.page_purchasing_all(query)
405
+ total_page = data['total_page']
406
+ result = data['data']
407
+ for page_number in range(2, total_page + 1):
408
+ query.page_no = page_number
409
+ data = await self.page_purchasing_all(query)
410
+ result.extend(data['data'])
411
+ return result
412
+
413
+ async def wait_pay_page_list(self, data: dict):
414
+ """
415
+ 采购分页
416
+ :return:
417
+ """
418
+ async with self.__sem:
419
+ page_purchasing_all_pageList_res = await self.__async_client.post(
420
+ "/dxmPurchasingNote/waitPayPageList.htm",
421
+ data=data)
422
+ page_info = get_page_info(page_purchasing_all_pageList_res.text)
423
+ purchase_order_number_list = list_wait_pay_page_purchase_order_number(page_purchasing_all_pageList_res.text)
424
+ # 200个200个一批进行处理
425
+ page_data = list()
426
+ for i in range(0, len(purchase_order_number_list), 200):
427
+ search_value = ','.join(purchase_order_number_list[i:i + 200])
428
+ data = await self.list_purchasing_all(PurchasingAllQuery(search_value=search_value
429
+ , search_type=0))
430
+ page_data.extend(data)
431
+ return {
432
+ **page_info,
433
+ 'data': page_data
434
+ }
435
+
436
+ async def wait_pay_list(self, data: dict):
437
+ """
438
+ 采购订单其它查询列表
439
+ :param data:
440
+ :return:
441
+ """
442
+ async with self.__sem:
443
+ data['pageNo'] = 1
444
+ wait_pay_page_list_res = await self.wait_pay_page_list(data)
445
+ total_page = wait_pay_page_list_res['total_page']
446
+ result = wait_pay_page_list_res['data']
447
+ for page_number in range(2, total_page + 1):
448
+ data['pageNo'] = page_number
449
+ wait_pay_page_list_res = await self.wait_pay_page_list(data)
450
+ result.extend(wait_pay_page_list_res['data'])
451
+ return result
452
+
453
+ async def wait_pay_alibaba_page_list(self, data: dict):
454
+ """
455
+ 采购订单1688采购分页
456
+ :return:
457
+ """
458
+ wait_pay_alibaba_page_list_res = await self.__async_client.post('/dxmPurchasingNote/waitPayAliBabaPageList.htm',
459
+ data=data)
460
+ page_info = get_page_info(wait_pay_alibaba_page_list_res.text)
461
+ purchase_order_number_list = list_1688_purchase_order_number(wait_pay_alibaba_page_list_res.text)
462
+ # 分页数据
463
+ page_data = list()
464
+ # 200个一批进行搜索
465
+ for i in range(0, len(purchase_order_number_list), 200):
466
+ search_value = ','.join(purchase_order_number_list[i:i + 200])
467
+ data = await self.list_purchasing_all(PurchasingAllQuery(search_value=search_value
468
+ , search_type=0))
469
+ page_data.extend(data)
470
+ return {
471
+ **page_info,
472
+ 'data': page_data
473
+ }
474
+
475
+ async def wait_pay_alibaba_list(self, data: dict):
476
+ """
477
+ 采购订单1688采购列表
478
+ :param data:
479
+ :return:
480
+ """
481
+ data['pageNo'] = 1
482
+ wait_pay_alibaba_page_list_res = await self.wait_pay_alibaba_page_list(data)
483
+ total_page = wait_pay_alibaba_page_list_res['total_page']
484
+ result = wait_pay_alibaba_page_list_res['data']
485
+ for page_number in range(2, total_page + 1):
486
+ data['pageNo'] = page_number
487
+ wait_pay_alibaba_page_list_res = await self.wait_pay_alibaba_page_list(data)
488
+ result.extend(wait_pay_alibaba_page_list_res['data'])
489
+ return result
490
+
491
+ async def __sync_alibaba_order(self):
492
+ """
493
+ 采购全部同步订单
494
+ :return:
495
+ """
496
+ async with self.__sem:
497
+ sync_alibaba_order_response = await self.__async_client.post("/dxmPurchasingNote/syncAliBabaOrder.json")
498
+ return sync_alibaba_order_response.json()
499
+
500
+ async def sync_alibaba_order(self):
501
+ """
502
+ 同步采购全部订单
503
+ :return:
504
+ """
505
+ sync_alibaba_order_data = await self.__sync_alibaba_order()
506
+ process_uuid = sync_alibaba_order_data.get('uuid')
507
+ while True:
508
+ # 查询同步进度
509
+ check_process_res = await self.__check_process(process_uuid)
510
+ process_code = check_process_res.get('processMsg').get('code')
511
+ if process_code:
512
+ # 同步完成结束监测
513
+ break
514
+ await asyncio.sleep(1)
515
+
516
+ async def validate_price(self, ids: str):
517
+ """
518
+ 采购校验价格
519
+ :param ids: purchase_id 多个,分隔
520
+ :return:
521
+ """
522
+ validate_price_res = await self.__async_client.post("/dxmPurchasingNote/validatePrice.json", data={
523
+ 'ids': ids
524
+ })
525
+ return validate_price_res
526
+
527
+ async def wait_pay_pay_money(self, purchase_id: str):
528
+ """
529
+ 采购订单支付(通过审核)
530
+ :param purchase_id:
531
+ :return:
532
+ """
533
+ async with self.__sem:
534
+ wait_pay_pay_money_res = await self.__async_client.post("/dxmPurchasingNote/waitPayPayMoney.json", data={
535
+ 'id': purchase_id,
536
+ 'auditResult': '1',
537
+ })
538
+ return wait_pay_pay_money_res.json()
539
+
540
+ async def submit_audit(self, purchase_id: str):
541
+ """
542
+ 提交审核
543
+ :param purchase_id:
544
+ :return:
545
+ """
546
+ async with self.__sem:
547
+ submit_audit_res = await self.__async_client.post("/dxmPurchasingNote/submitAudit.json", data={
548
+ 'id': purchase_id
549
+ })
550
+ return submit_audit_res.json()
391
551
 
392
552
  async def __aenter__(self):
393
553
  return self
@@ -52,6 +52,27 @@ def __parse_js_vals(js_snippet: str) -> dict[str, int]:
52
52
  return {key: int(value) for key, value in matches}
53
53
 
54
54
 
55
+ def get_purchase_pagination_info(script: str) -> dict:
56
+ # 定义要提取的字段及其对应的 key 名
57
+ field_map = {
58
+ 'pageNo': 'page_number',
59
+ 'pageSize': 'page_size',
60
+ 'totalSize': 'total_size',
61
+ 'totalPage': 'total_page',
62
+ }
63
+
64
+ result = {}
65
+
66
+ for field, key in field_map.items():
67
+ pattern = rf"\$\('#{field}'\)\.val\('(\d+)'\);"
68
+ match = re.search(pattern, script)
69
+ if not match:
70
+ raise ValueError(f"无法从字符串中提取字段:{field}")
71
+ result[key] = int(match.group(1))
72
+
73
+ return result
74
+
75
+
55
76
  def get_purchasing_page_info(html_str: str):
56
77
  """
57
78
  获取分页信息和分页数据(店小秘->采购部分)
@@ -1,22 +1,63 @@
1
+ import lxml.html
1
2
  from lxml import html
2
3
 
4
+ from ey_commerce_lib.utils.list_util import get_str_list_first_not_blank_or_none
3
5
 
4
- def list_purchasing_all(html_str: str):
6
+
7
+ def list_1688_purchase_order_number(html_str: str) -> list[str]:
8
+ """
9
+ 根据1688采购页面html获取1688采购页面采购单号列表
10
+ :param html_str:
11
+ :return:
12
+ """
13
+ tree = html.fromstring(html_str)
14
+ good_element_list: list[html.HtmlElement] = tree.xpath('//tr[contains(@class, "goodsId")]')
15
+ purchase_order_number_list = list()
16
+ for good_element in good_element_list:
17
+ purchase_order_number_list.append(get_str_list_first_not_blank_or_none(
18
+ good_element.xpath('.//span[@class="limingcentUrlpic"]/text()')))
19
+ return purchase_order_number_list
20
+
21
+
22
+ def list_wait_pay_page_purchase_order_number(html_str: str) -> list[str]:
23
+ """
24
+ 根据采购wait_pay_pag这个请求返回html代码获取采购单号列表
25
+ :param html_str:
26
+ :return:
27
+ """
28
+ tree = html.fromstring(html_str)
29
+ good_element_list: list[html.HtmlElement] = tree.xpath('//tr[contains(@class, "goodsId")]')
30
+ purchase_order_number_list = list()
31
+ for good_element in good_element_list:
32
+ purchase_order_number = get_str_list_first_not_blank_or_none(
33
+ good_element.xpath('.//a[@class="limingcentUrlpic"]/text()'))
34
+ purchase_order_number_list.append(purchase_order_number)
35
+ return purchase_order_number_list
36
+
37
+
38
+ def list_purchasing_all(html_str: str) -> list[dict]:
39
+ """
40
+ 根据采购全部页面html,获取采购页面详细数据列表
41
+ :param html_str:
42
+ :return:
43
+ """
5
44
  tree = html.fromstring(html_str)
6
45
  good_element_list: list[html.HtmlElement] = tree.xpath('//tr[contains(@class, "goodsId")]')
46
+ purchase_result = list()
7
47
  for good_element in good_element_list:
8
- purchase_id = good_element.xpath('@id')[0]
9
- purchase_order_number = good_element.xpath('.//a[@class="limingcentUrlpic"]/text()')[0]
10
- ghs_id = good_element.xpath('.//span[contains(@class, "ghsHoverPrompt")]/@data-ghsid')[0]
11
- ghs_name = good_element.xpath('.//span[contains(@class, "ghsHoverPrompt")]/span/text()')[0].strip()
48
+ purchase_id = get_str_list_first_not_blank_or_none(good_element.xpath('@id'))
49
+ purchase_order_number = get_str_list_first_not_blank_or_none(
50
+ good_element.xpath('.//a[@class="limingcentUrlpic"]/text()'))
51
+ ghs_id = get_str_list_first_not_blank_or_none(
52
+ good_element.xpath('.//span[contains(@class, "ghsHoverPrompt")]/@data-ghsid'))
53
+ ghs_name = get_str_list_first_not_blank_or_none(
54
+ good_element.xpath('.//span[contains(@class, "ghsHoverPrompt")]/span/text()'))
12
55
  warehouse_name, purchase_info = good_element.xpath('.//td[4]/span/text()')[0].strip().split('|')
13
- # 采购员
14
56
  agent_name = purchase_info.split(':')[1]
15
- #print(purchase_order_number, ghs_id, ghs_name, warehouse_name, agent_name)
16
57
  # 获取兄弟元素
17
58
  content_element = good_element.getnext()
18
59
  # 获取商品信息
19
- img = content_element.xpath('.//img/@data-original')[0]
60
+ img = get_str_list_first_not_blank_or_none(content_element.xpath('.//img/@data-original'))
20
61
  content_number_info = content_element.xpath('./td[2]/text()')
21
62
  product_zl_number = None
22
63
  purchase_number = None
@@ -27,14 +68,55 @@ def list_purchasing_all(html_str: str):
27
68
  elif content_number.split(':')[0] == '采购数量':
28
69
  purchase_number = content_number.split(':')[1].strip()
29
70
  # 解析出货款
30
- total_amount = content_element.xpath('./td[3]//input/@data-totalamount')[0]
71
+ total_amount = get_str_list_first_not_blank_or_none(content_element.xpath('./td[3]//input/@data-totalamount'))
31
72
  # 运费
32
- shipping_amount = content_element.xpath('./td[3]//input/@value')[0]
33
- platform_list = content_element.xpath('./td[4]/div/span')
34
- if len(platform_list) > 0:
35
- source = platform_list[0].text.strip()
36
- else:
37
- source = content_element.xpath('./td[4]/span/span/text()')[0].strip()
38
- source2 = content_element.xpath('./td[4]/span/span[@class="alibabaPurchaseOrder"]/text()')[0].strip()
39
- source = source + source2
40
- print(source)
73
+ shipping_amount = get_str_list_first_not_blank_or_none(content_element.xpath('./td[3]//input/@value'))
74
+ source = None
75
+ source_list = content_element.xpath('./td[4]/span[1]')
76
+ if len(source_list) == 0:
77
+ # 说明不是淘供销
78
+ source_list = content_element.xpath('./td[4]/div[1]')
79
+
80
+ if len(source_list) > 0:
81
+ try:
82
+ source = source_list[0].text_content()
83
+ source = source.strip()
84
+ platform, source_str = source.split(":")
85
+ source = platform.strip() + ":" + source_str.strip()
86
+ except:
87
+ source = None
88
+ # 获取物流信息
89
+ track_element_list = content_element.xpath('./td[4]//a[@class="getLogisticsMsgBox"]')
90
+ track_list = list()
91
+ for track_element in track_element_list:
92
+ tracking_id = get_str_list_first_not_blank_or_none(track_element.xpath("@trackingid"))
93
+ tracking_number = get_str_list_first_not_blank_or_none(track_element.xpath("@data-trackingnumber"))
94
+ tracking_code = get_str_list_first_not_blank_or_none(track_element.xpath("@data-trackingcode"))
95
+ track_status = get_str_list_first_not_blank_or_none(
96
+ track_element.xpath('./span[contains(@class, "iconfont")]/@data-original-title'))
97
+ track_list.append({
98
+ "tracking_id": tracking_id,
99
+ "tracking_number": tracking_number,
100
+ "tracking_code": tracking_code,
101
+ "track_status": track_status
102
+ })
103
+
104
+ # 状态
105
+ status = get_str_list_first_not_blank_or_none(content_element.xpath('./td[6]/div[@class="mBottom3"]/text()'))
106
+ purchase_result.append({
107
+ "purchase_id": purchase_id,
108
+ "purchase_order_number": purchase_order_number,
109
+ "ghs_id": ghs_id,
110
+ "ghs_name": ghs_name,
111
+ "agent_name": agent_name,
112
+ "img": img,
113
+ "product_zl_number": product_zl_number,
114
+ "purchase_number": purchase_number,
115
+ "total_amount": total_amount,
116
+ "shipping_amount": shipping_amount,
117
+ "source": source,
118
+ "status": status,
119
+ 'track_list': track_list
120
+ })
121
+
122
+ return purchase_result
@@ -105,6 +105,7 @@ class PurchasingAllQuery(BaseModel):
105
105
  comment_colors: str = ''
106
106
  # 仓库id
107
107
  warehouse_id: str = ''
108
+
108
109
  # 店铺id(或者1688账号)
109
110
  authorization_id: str = ''
110
111
  # 排序方式: 1(按创建时间) 2(按更新时间) 4(按照采购单号)5(按照供货商名)
@@ -157,5 +158,8 @@ class PurchasingAllQuery(BaseModel):
157
158
 
158
159
  model_config = ConfigDict(
159
160
  alias_generator=to_camel,
160
- populate_by_name=True # 对应旧版的 allow_population_by_field_name
161
- )
161
+ populate_by_name=True
162
+ )
163
+
164
+
165
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ey-commerce-lib
3
- Version: 1.0.3
3
+ Version: 1.0.5
4
4
  Summary: eeyoung电商客户端调用封装
5
5
  Author-email: 饶奇奇 <1124393197@qq.com>
6
6
  Requires-Python: >=3.10
@@ -1,25 +1,25 @@
1
1
  ey_commerce_lib/__init__.py,sha256=QTYqXqSTHFRkM9TEgpDFcHvwLbvqHDqvqfQ9EiXkcAM,23
2
2
  ey_commerce_lib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  ey_commerce_lib/dxm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- ey_commerce_lib/dxm/main.py,sha256=nJEsEp7shGofGdAOd3fIyCF7NxMigGwpMdlpDuFtbUs,14569
4
+ ey_commerce_lib/dxm/main.py,sha256=MZVOl-3M2fUj-_Rcwh6Rar30Wf1qX20stnRYo6H2P2w,21026
5
5
  ey_commerce_lib/dxm/order.py,sha256=hMdNm9X5h9tbvMWFnyE5hcSF4butzn7m-akGqLQUD0k,35
6
6
  ey_commerce_lib/dxm/constant/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  ey_commerce_lib/dxm/constant/order.py,sha256=U-2NYnkIcqukzMtOFpfqvzIktu_t7jYEms_n9LgKMlY,2213
8
8
  ey_commerce_lib/dxm/exception/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  ey_commerce_lib/dxm/exception/common.py,sha256=DM5vItHdZCGK2Piqp2S5TFxPm3pioMzzlV-1RTxty00,159
10
10
  ey_commerce_lib/dxm/parser/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- ey_commerce_lib/dxm/parser/common.py,sha256=bJcP6ZQd0hNeZpEU-8_nN_2AKB69WufKF_JKXtKYZqA,2425
11
+ ey_commerce_lib/dxm/parser/common.py,sha256=-3OwoGsuHpugFS96OAzimZTXLkH7qZqmNvP-kvVSndM,3035
12
12
  ey_commerce_lib/dxm/parser/order.py,sha256=5t_ie5nkmhZdDC7NBOhIkNxRYHTmlZCxs4Y6TseCp88,16542
13
- ey_commerce_lib/dxm/parser/purchase.py,sha256=gBHpIMPPgOZXdU6RIU_a8NogjtzPphCtcLmRauh8r-s,2206
13
+ ey_commerce_lib/dxm/parser/purchase.py,sha256=7ULQHAIqUuUcpvWM1ut7uqCQhwE-DcQ7K3qftsfNlK8,5768
14
14
  ey_commerce_lib/dxm/parser/warehouse.py,sha256=LfmqVixV5IcnPvr6Ma4XYoWUdXixQ16xzPP07bJrWb0,3192
15
15
  ey_commerce_lib/dxm/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  ey_commerce_lib/dxm/schemas/common.py,sha256=ihCeYrh4K_-m9_4rVzHm-o8rFNqzcD5XkO0JQd2023g,234
17
17
  ey_commerce_lib/dxm/schemas/order.py,sha256=uzhSgW0d7Z3L1yYb0meZ2AEF1OosnVM408W2-wZVriE,7802
18
- ey_commerce_lib/dxm/schemas/warehouse.py,sha256=WkJcLIoeGsTkqEK-6UdQMxScdFT05gfGHv7ZWsavo84,5122
18
+ ey_commerce_lib/dxm/schemas/warehouse.py,sha256=kHxNMgkVHCILfAWuDhLN0Q5pDtb3Nd5qexnJowCSnrI,5082
19
19
  ey_commerce_lib/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  ey_commerce_lib/utils/dxm.py,sha256=jVNltK_Pm_yMzXReD0Aw5VW6kzIZ5Bn23RucS0DKBI0,1196
21
21
  ey_commerce_lib/utils/list_util.py,sha256=R1w7B1m3sEXr38zSHWp-15C3xAs5ykYCCpvwmnRW4xs,545
22
22
  ey_commerce_lib/utils/str.py,sha256=939xE0y8U7KEWjwbEezMlaWJNBsfb2BSb-dBpYbOD8Q,138
23
- ey_commerce_lib-1.0.3.dist-info/METADATA,sha256=eOozemj6uuIs4vM4wkUR4BV0opyqDG7enEzoO02QRl0,326
24
- ey_commerce_lib-1.0.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
25
- ey_commerce_lib-1.0.3.dist-info/RECORD,,
23
+ ey_commerce_lib-1.0.5.dist-info/METADATA,sha256=efMnG-13V7ehNQxXj4MitQE7Az6cI32-_gOBIT3CNHw,326
24
+ ey_commerce_lib-1.0.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
25
+ ey_commerce_lib-1.0.5.dist-info/RECORD,,