modified: amazon/__pycache__/approve.cpython-39.pyc

modified:   amazon/__pycache__/asin_status.cpython-39.pyc
	new file:   amazon/__pycache__/detail_spider.cpython-39.pyc
	modified:   amazon/__pycache__/main.cpython-39.pyc
	modified:   amazon/__pycache__/match_action.cpython-39.pyc
	modified:   amazon/__pycache__/price_match.cpython-39.pyc
	modified:   amazon/approve.py
	modified:   amazon/asin_status.py
	new file:   amazon/detail_spider.py
	modified:   amazon/main.py
	modified:   amazon/match_action.py
	modified:   amazon/price_match.py
	modified:   assets/convert.js
	modified:   assets/dedupe.js
	modified:   assets/delete-brand.js
	modified:   assets/split.js
	modified:   new_web_source/convert.html
	modified:   new_web_source/dedupe.html
	modified:   new_web_source/delete-brand.html
	modified:   new_web_source/split.html
	modified:   web_source/brand.html
This commit is contained in:
铭坤
2026-04-27 00:21:37 +08:00
parent d272afae1c
commit 0b57aea5f6
21 changed files with 7149 additions and 130 deletions

Binary file not shown.

View File

@@ -483,8 +483,8 @@ class AmzoneApprove(AmamzonBase):
load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]",timeout=5)
if len(load_ele) > 0:
load_ele[0].wait.deleted(timeout=3, raise_err=False)
time.sleep(0.5)
time.sleep(0.5)
# 获取当前页码
try:
page_pamel = self.tab.eles('xpath://kat-pagination',timeout=5)
@@ -1065,6 +1065,8 @@ class ApproveTask:
# 更新已处理国家数
if task_id in runing_task:
runing_task[task_id]["processed_countries"] += 1
self.log(f"{task_id}任务处理完成")
# 最后回传,标记完成
try:
self.post_result(task_id, shop_name, country_code, "", "", is_done=True)

View File

@@ -432,6 +432,8 @@ class StatusTask:
# 关闭店铺
driver.close_store()
self.log(f"{task_id}任务处理完成")
# 最后回传,标记完成
try:
# self.post_result(task_id, shop_name, country_code, "", "", is_done=True)

6907
app/amazon/detail_spider.py Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -10,6 +10,7 @@ from amazon.approve import ApproveTask
from amazon.match_action import MatchTak
from amazon.price_match import PriceTask
from amazon.asin_status import StatusTask
from amazon.detail_spider import SpiderTask
from amazon.tool import get_shop_info,show_notification
@@ -57,7 +58,8 @@ class TaskMonitor:
"product-risk-resolve-run" : "产品风险审批",
"shop-match-run" : "匹配价格",
"price-track-run" : "跟价",
"query-asin-run" : "状态查询"
"query-asin-run" : "状态查询",
"appearance-patent-run" : "亚马逊采集",
}
try:
while self.running:
@@ -125,7 +127,8 @@ class TaskMonitor:
"产品风险审批" : ApproveTask,
"匹配价格" : MatchTak,
"跟价" : PriceTask,
"状态查询" : StatusTask
"状态查询" : StatusTask,
"亚马逊采集" : SpiderTask,
}
self.log(f"线程 {id(task_data)} 开始处理产品风险审批任务...")
# 创建ApproveTask实例并处理任务

View File

@@ -451,7 +451,7 @@ class MatchTak:
# 更新已处理国家数
if task_id in runing_task:
runing_task[task_id]["processed_countries"] += 1
self.log(f"{task_id}任务处理完成")
# 最后回传,标记完成
try:
# self.post_result(task_id, shop_name, country_code, "", "", is_done=True)

View File

@@ -17,6 +17,97 @@ from amazon.tool import show_notification,get_shop_info,remove_special_character
from config import runing_task, runing_shop,base_dir,DELETE_BRAND_API_BASE
class RepricingLogic:
@staticmethod
def situation_1_general_decrease(my_price, rank1_price, is_first_time=False):
"""
情况1常规递减跟价 (最左侧独立长图块)
当不是自己购物车时,按总价当作第一名递减。
"""
if is_first_time:
return rank1_price - 0.3
diff = abs(my_price - rank1_price)
# 精简了原图中长串的阶梯逻辑
if diff <= 0.3:
return rank1_price - 0.5
elif diff <= 0.8:
return rank1_price - 0.7
elif diff <= 10.5:
# 0.8 到 10.5 之间原图逻辑全部是“减1”
return rank1_price - 1.0
else:
return None # 相差10.5以上,跳过
@staticmethod
def situation_2_own_buybox(my_price, rank2_price):
"""
情况2已经是自己购物车
逻辑:判断与第二名的差价,如果拉开足够差距,则稍微降一点点(减0.5)保持优势,防止卖太便宜。
"""
diff = abs(rank2_price - my_price)
# 1. 绝对差价2欧以上
if diff >= 2.0:
return rank2_price - 0.3
# 2. 产品售价区间判定 (是否要提高价格)
if (20 <= my_price < 30 and diff >= 4) or \
(30 <= my_price < 60 and diff >= 8) or \
(60 <= my_price <= 150 and diff >= 15):
return rank2_price - 0.3 # 满足区间大差价,提价至第二名之下
return my_price # 不满足条件则保持原价
@staticmethod
def situation_3_not_own_buybox(my_price, rank1_price):
"""
情况3不是自己购物车 (常规情况)
"""
diff = abs(my_price - rank1_price)
if diff <= 0.3:
return rank1_price - 0.5
elif 0.5 <= diff <= 0.8:
return rank1_price - 0.7
elif 0.8 < diff <= 2.5:
return rank1_price - 1.0
elif diff > 2.5: # 2.5-3.5以上跳过
return None
return rank1_price - 0.3 # 默认按第一名减0.3
@staticmethod
def situation_4_encounter_amz_us_1st(my_price, amz_us_price):
"""
情况4第一名是 Amazon US 卖家
"""
diff = abs(my_price - amz_us_price)
if diff <= 3:
return amz_us_price - 2
elif 4 <= diff <= 6:
return amz_us_price - 3
elif 8 <= diff <= 12:
return None # 跳过不跟价
return amz_us_price - 3 # 默认直接按照 Amazon US 减去3
@staticmethod
def situation_5_im_1st_amz_us_2nd(my_price, amz_us_price):
"""
情况5自己是第一名第二名是 Amazon US 卖家
"""
diff = abs(amz_us_price - my_price)
if diff <= 7:
return None # 相差5以内跳过 (保持原价)
else:
return amz_us_price - 5
def calculate_target_price(
front_end_data,current_Price,current_shop_name,
recommended_price,recommended_shipping
@@ -35,65 +126,44 @@ def calculate_target_price(
# --- Step 2: 紫鸟后台特殊判定 (最高优先级) ---
if recommended_shipping > 0:
backend_base_price = recommended_price
backend_shipping = recommended_shipping
total_price = backend_base_price + backend_shipping
if is_my_buybox:
# 🌟【逻辑更新】:如果是自己的购物车,直接跳过,不做任何价格调整
return None
else:
# 不是自己的购物车:直接将紫鸟的总和作为"第一名"价格,强制抛入阶梯跟价逻辑
return calculate_standard_competitor_pricing(my_price, total_price)
price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格
return RepricingLogic.situation_1_general_decrease(my_price,price_1,is_my_buybox)
# backend_base_price = recommended_price
# backend_shipping = recommended_shipping
# total_price = backend_base_price + backend_shipping
#
# if is_my_buybox:
# # 🌟【逻辑更新】:如果是自己的购物车,直接跳过,不做任何价格调整
# return None
# else:
# # 不是自己的购物车:直接将紫鸟的总和作为"第一名"价格,强制抛入阶梯跟价逻辑
# return calculate_standard_competitor_pricing(my_price, total_price)
# # 第一名是自己, 第二名 Amazon US 卖家 的情况
shop_name_1 = front_end_data.get("top_sellers")[0].get("shop_name")
shop_name_2 = front_end_data.get("top_sellers")[1].get("shop_name") if len(front_end_data.get("top_sellers")) >=2 else ""
if shop_name_1 == current_shop_name and "Amazon" in shop_name_2:
price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格
diff = abs(my_price - price_2)
if diff < 5:
return price_2 -3
elif 5.0 < diff <= 8.0:
return price_2 -3
return RepricingLogic.situation_5_im_1st_amz_us_2nd(my_price,price_2)
# --- Step 3: 常规核心分流逻辑 (如果没有紫鸟后台数据) ---
# 分支 A第一名是 Amazon US 卖家 (特殊强敌优先)
price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格
if "Amazon." in cart_seller:
diff = abs(my_price - price_1)
if diff <= 5.0 :
return None
elif 5.0 < diff <= 8.0:
return price_1 - 3.0
elif diff > 8.0:
return price_1 - 6 # 跳过,不跟价
if "Amazon" in shop_name_1:
return RepricingLogic.isituation_4_encounter_amz_us_1st(my_price,price_1)
# 分支 B不是 Amazon US且目前是自己的购物车
elif is_my_buybox:
price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格
diff_with_2nd = price_2 - my_price
if diff_with_2nd >= 2.0:
return price_2 - 0.3
else:
# 提价区间判定
if (20 <= my_price <= 30) and diff_with_2nd >= 4:
return price_2 - 0.3
elif (30 <= my_price <= 60) and diff_with_2nd >= 8:
return price_2 - 0.3
elif (60 <= my_price <= 150) and diff_with_2nd >= 15:
return price_2 - 0.3
else:
return None
return RepricingLogic.situation_2_own_buybox(my_price,price_2)
# 分支 C不是 Amazon US也不是自己的购物车
else:
# 正常情况下的普通跟价,调用阶梯逻辑
return calculate_standard_competitor_pricing(my_price, price_1)
return RepricingLogic.situation_3_not_own_buybox(my_price, price_1)
# =====================================================================
@@ -107,7 +177,7 @@ def calculate_standard_competitor_pricing(my_current_price, target_competitor_pr
diff = abs(my_current_price - target_competitor_price)
# 根据阶梯执行跟价扣减
if diff <= 0.3:
if 0 < diff < 0.5:
return base_target - 0.5
elif 0.5 <= diff <= 0.8:
return base_target - 0.7
@@ -117,12 +187,13 @@ def calculate_standard_competitor_pricing(my_current_price, target_competitor_pr
return base_target - 1.0
elif 2.5 < diff <= 3 :
return None # 差距过大,跳过不跟价
elif diff > 3:
# elif diff > 3:
# return base_target
else:
return base_target
class ChromeAmzone:
mark_name = "亚马逊详情采集"
@@ -531,8 +602,8 @@ class AmzonePriceMatch(AmamzonBase):
current_country_ele = self.tab.ele('xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]',
timeout=20)
current_country = current_country_ele.text.strip()
while retry_num < 3: # 最多重试3次
max_retry_num = 5
while retry_num < max_retry_num: # 最多重试3次
try:
if appoint_asin is not None:
print(self.mark_name,"指定asin操作",appoint_asin)
@@ -548,7 +619,7 @@ class AmzonePriceMatch(AmamzonBase):
page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5)
if len(page_pamel) > 0:
current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text
# yield (None,{"page":int(current_page.strip())})
# 总页数
total_page = page_pamel[0].sr.eles(
'xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]')
@@ -567,6 +638,14 @@ class AmzonePriceMatch(AmamzonBase):
sku_ls = self.tab.eles("xpath://div[@data-sku]", timeout=10)
print(f"{self.mark_name}】获取到 {len(sku_ls)}")
if len(sku_ls) == 0:
retry_num += 1
print(f"没有获取到 ASIN 商品,重试{retry_num}/{max_retry_num}")
self.tab.refresh()
self.tab.wait.doc_loaded(raise_err=False, timeout=120)
continue
# for sku_ele in sku_ls[0:2]:
for sku_ele in sku_ls:
@@ -636,6 +715,7 @@ class AmzonePriceMatch(AmamzonBase):
chrome = ChromeAmzone(tab=new_tab)
front_end_data = chrome.run(country=current_country)
chrome.close()
self.clear_tab()
print(self.mark_name,"亚马逊前台抓取到数据",front_end_data)
if front_end_data is None or len(front_end_data.get("top_sellers")) == 0:
yield (asin, {
@@ -698,8 +778,28 @@ class AmzonePriceMatch(AmamzonBase):
"firstPlace": price_1,
"secondPlace": price_2,
"cartShopName" : cartShopName,
"shippingFee" : f"{shipping_fee}",
"priceChangeStatus" : "改价成功",
})
else:
recommendedPrice = recommend_price + shipping_fee
price_1 = float(front_end_data.get("top_sellers")[0].get("price")) if len(
front_end_data.get("top_sellers")) >= 2 else "" # 实际第一名价格
price_2 = float(front_end_data.get("top_sellers")[1].get("price")) if len(
front_end_data.get("top_sellers")) >= 2 else "" # 实际第二名价格
cartShopName = front_end_data.get("cart_seller")
yield (asin, {
"statu": "跳过,无需改价",
"currentPrice": current_price,
"recommendedPrice": f"{recommendedPrice}",
"minimumPrice": bottom_price, # 最低价格
"firstPlace": price_1,
"secondPlace": price_2,
"cartShopName": cartShopName,
"shippingFee": f"{shipping_fee}",
"priceChangeStatus": "跳过,无需改价",
})
already_asin.add(asin)
# 判断是否存在需要翻页的情况
@@ -714,6 +814,7 @@ class AmzonePriceMatch(AmamzonBase):
num += 1
print(f"{self.mark_name}】【程序计算】正在翻页,已翻 {num} 页...")
already_asin = set()
retry_num = 0
except Exception as e:
print(f"{self.mark_name}】处理跟价操作异常", e)
@@ -937,7 +1038,7 @@ class PriceTask:
minimum_price_by_country_and_asin = shop_item.get("minimum_price_by_country_and_asin",{})
if len(minimum_price_by_country_and_asin) > 0:
country_codes = minimum_price_by_country_and_asin.keys()
# 指定ASIN的情况
mode = shop_item.get("mode")
@@ -1006,6 +1107,7 @@ class PriceTask:
self.post_stage_finished(task_id, user_id, stage_index)
except Exception as e:
self.log(f"回传结果失败: {str(e)}", "ERROR")
self.log(f"{task_id}任务处理完成")
# 从正在执行中的店铺列表中移除
if shop_name in runing_shop:
@@ -1136,32 +1238,35 @@ class PriceTask:
else:
_shopMallName = shopMallName
ap_asin = None
for _ in range(max_retries):
for asin, status in driver.run_page_action(
current_shop_name=_shopMallName,
appoint_asin=ap_asin,skip_asin=skip_asin,mode=mode,
miniprice_info=miniprice_info
):
if asin is None:
continue
# 检查是否收到暂停请求
if task_id in runing_task and runing_task[task_id].get("stop_requested", False):
self.log(f"检测到任务 {task_id} 的暂停请求停止处理ASIN", "WARNING")
break
for asin, status in driver.run_page_action(
current_shop_name=_shopMallName,
appoint_asin=ap_asin,skip_asin=skip_asin,mode=mode,
miniprice_info=miniprice_info
):
# 检查是否收到暂停请求
if task_id in runing_task and runing_task[task_id].get("stop_requested", False):
self.log(f"检测到任务 {task_id} 的暂停请求停止处理ASIN", "WARNING")
break
self.log(f"ASIN {asin} 处理结果: {status}")
self.log(f"ASIN {asin} 处理结果: {status}")
# 更新任务状态
if task_id in runing_task:
runing_task[task_id]["current_asin"] = asin
runing_task[task_id]["processed_asins"] += 1
# 更新任务状态
if task_id in runing_task:
runing_task[task_id]["current_asin"] = asin
runing_task[task_id]["processed_asins"] += 1
runing_task[task_id]["failed_count"] += 1
runing_task[task_id]["failed_count"] += 1
# 回传结果到API
try:
self.post_result(task_id, shop_name, country_code, asin, status,shopMallName)
except Exception as e:
self.log(f"回传结果失败: {str(e)}", "ERROR")
# 回传结果到API
try:
self.post_result(task_id, shop_name, country_code, asin, status,shopMallName)
except Exception as e:
self.log(f"回传结果失败: {str(e)}", "ERROR")
break
self.log(f"国家 {country_name} 处理完成")
@@ -1216,18 +1321,6 @@ class PriceTask:
"""
url = f"{DELETE_BRAND_API_BASE}/api/price-track/tasks/{task_id}/result"
"""
(asin,{
"statu" : "改价成功",
"currentPrice" : current_price,
"recommendedPrice" : f"{recommendedPrice}",
"minimumPrice" : bottom_price, #最低价格
"firstPlace": price_1,
"secondPlace": price_2,
"cartShopName" : current_shop_name,
"priceChangeStatus" : "改价成功",
})
"""
payload = {
"shops": [
@@ -1248,6 +1341,7 @@ class PriceTask:
"deleteSkipAsin": status.get("deleteSkipAsin",False),
"removeAsin": status.get("removeAsin") if status.get("removeAsin") else "",
# "modifyCount": "2",
"shippingFee" : status.get("shippingFee") if status.get("shippingFee") else "",
"status": status.get("statu")
}
]
@@ -1296,34 +1390,44 @@ class PriceTask:
if __name__ == '__main__':
# 使用示例
user_info = {
"company": "尾号5578的公司115",
"username": "自动化_Robot",
"password": "#20zsg25"
}
shop_name = "林建华"
country = "德国"
kill_process('v6')
driver = AmzonePriceMatch(user_info)
browser = driver.open_shop(shop_name)
sw_suc = driver.SwitchingCountries(country)
driver.SwitchPage()
risk_listing_filter = "Active"
_shopMallName = "WEIZHENFENG168"
ap_asin ="B0FHGQY18W"
skip_asin = []
for _ in range(3):
try:
sku_ls = driver.search(filter_type=risk_listing_filter)
break
except Exception as e:
print(e)
driver.tab.refresh()
if len(sku_ls) > 0:
print("有数据,开始操作")
for asin, status in driver.run_page_action(
current_shop_name=_shopMallName,
appoint_asin=ap_asin,skip_asin=skip_asin,mode="asin"
):
print(f"ASIN {asin} 的处理结果: {status}")
print("已完成操作")
# user_info = {
# "company": "尾号5578的公司115",
# "username": "自动化_Robot",
# "password": "#20zsg25"
# }
# shop_name = "刘建煌"
# country = "德国"
# kill_process('v6')
# driver = AmzonePriceMatch(user_info)
# browser = driver.open_shop(shop_name)
# sw_suc = driver.SwitchingCountries(country)
# driver.SwitchPage()
# risk_listing_filter = "Active"
# _shopMallName = "Jianhuang 888"
# ap_asin ="B0BGHRP6BS"
# skip_asin = []
# for _ in range(3):
# try:
# sku_ls = driver.search(filter_type=risk_listing_filter)
# break
# except Exception as e:
# print(e)
# driver.tab.refresh()
# if len(sku_ls) > 0:
# print("有数据,开始操作")
# for asin, status in driver.run_page_action(
# current_shop_name=_shopMallName,
# appoint_asin=ap_asin,skip_asin=skip_asin,mode="asin"
# ):
# print(f"ASIN {asin} 的处理结果: {status}")
# print("已完成操作")
front_end_data = {"top_sellers": [{"rank": 1, "price": "36.81", "stock": "5", "shop_name": "Windera"}, {"rank": 2, "price": "36.50", "stock": "100", "shop_name": "Jianhuang 888"}], "cart_seller": "Windera", "timestamp": "2026-04-25 09:32:58"}
current_Price = 36.50
current_shop_name = "Jianhuang 888"
recommended_price = 36.81
recommended_shipping = 0
calculate_target_price(
front_end_data, current_Price, current_shop_name,
recommended_price, recommended_shipping
)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>格式转换 - 数富AI</title>
<script type="module" crossorigin src="/assets/convert.js"></script>
<link rel="modulepreload" crossorigin href="/assets/pywebview-CeWJDVeG.js">
<link rel="modulepreload" crossorigin href="/assets/brand-UU-ckLq6.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-ij4pgMq8.css">
<link rel="modulepreload" crossorigin href="/assets/pywebview-Bt854mYs.js">
<link rel="modulepreload" crossorigin href="/assets/brand-5-W0Wonr.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
<link rel="stylesheet" crossorigin href="/assets/convert-7wWJ02Tw.css">
</head>
<body>

View File

@@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>数据去重 - 数富AI</title>
<script type="module" crossorigin src="/assets/dedupe.js"></script>
<link rel="modulepreload" crossorigin href="/assets/pywebview-CeWJDVeG.js">
<link rel="modulepreload" crossorigin href="/assets/brand-UU-ckLq6.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-ij4pgMq8.css">
<link rel="modulepreload" crossorigin href="/assets/pywebview-Bt854mYs.js">
<link rel="modulepreload" crossorigin href="/assets/brand-5-W0Wonr.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
<link rel="stylesheet" crossorigin href="/assets/dedupe-BpNHwt51.css">
</head>
<body>

View File

@@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>删除品牌 - 数富AI</title>
<script type="module" crossorigin src="/assets/delete-brand.js"></script>
<link rel="modulepreload" crossorigin href="/assets/pywebview-CeWJDVeG.js">
<link rel="modulepreload" crossorigin href="/assets/brand-UU-ckLq6.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-ij4pgMq8.css">
<link rel="modulepreload" crossorigin href="/assets/pywebview-Bt854mYs.js">
<link rel="modulepreload" crossorigin href="/assets/brand-5-W0Wonr.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
<link rel="stylesheet" crossorigin href="/assets/delete-brand-CWLpe7lu.css">
</head>
<body>

View File

@@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>数据拆分 - 数富AI</title>
<script type="module" crossorigin src="/assets/split.js"></script>
<link rel="modulepreload" crossorigin href="/assets/pywebview-CeWJDVeG.js">
<link rel="modulepreload" crossorigin href="/assets/brand-UU-ckLq6.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-ij4pgMq8.css">
<link rel="modulepreload" crossorigin href="/assets/pywebview-Bt854mYs.js">
<link rel="modulepreload" crossorigin href="/assets/brand-5-W0Wonr.js">
<link rel="stylesheet" crossorigin href="/assets/pywebview-Dp5dN8OO.css">
<link rel="stylesheet" crossorigin href="/assets/split-CRUIYKS6.css">
</head>
<body>

View File

@@ -401,6 +401,7 @@
<span class="nav-item disabled">采集数据</span>
<span class="nav-item disabled">变体分析</span>
<button type="button" class="nav-item active" data-panel="brandCheck">品牌检测</button>
<a class="nav-item" href="/new_web_source/appearance-patent.html">外观专利检测</a>
<a class="nav-item" href="/new_web_source/dedupe.html">数据去重</a>
<a class="nav-item" href="/new_web_source/split.html">数据拆分</a>
<a class="nav-item" href="/new_web_source/convert.html">格式转换</a>
@@ -413,7 +414,7 @@
<a class="nav-item" href="/new_web_source/product-risk.html">商品风险解决</a>
<a class="nav-item" href="/new_web_source/shop-match.html">定时匹配</a>
<a class="nav-item" href="/new_web_source/price-track.html">跟价</a>
<span class="nav-item disabled">巡店删除</span>
<a class="nav-item" href="/new_web_source/patrol-delete.html"巡店删除</a>
<a class="nav-item" href="/new_web_source/query-asin.html">查询ASIN</a>
<span class="nav-item disabled">取款</span>
<span class="nav-item disabled">店铺状态查询</span>