From 0b57aea5f697f563ecfed0f37b11115762201764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=93=AD=E5=9D=A4?= <10372463+ming-kun@user.noreply.gitee.com> Date: Mon, 27 Apr 2026 00:21:37 +0800 Subject: [PATCH] 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 --- app/amazon/__pycache__/approve.cpython-39.pyc | Bin 32560 -> 32601 bytes .../__pycache__/asin_status.cpython-39.pyc | Bin 18456 -> 18497 bytes .../__pycache__/detail_spider.cpython-39.pyc | Bin 0 -> 52087 bytes app/amazon/__pycache__/main.cpython-39.pyc | Bin 17671 -> 17787 bytes .../__pycache__/match_action.cpython-39.pyc | Bin 19235 -> 19276 bytes .../__pycache__/price_match.cpython-39.pyc | Bin 32199 -> 34191 bytes app/amazon/approve.py | 4 +- app/amazon/asin_status.py | 2 + app/amazon/detail_spider.py | 6907 +++++++++++++++++ app/amazon/main.py | 7 +- app/amazon/match_action.py | 2 +- app/amazon/price_match.py | 322 +- app/assets/convert.js | 2 +- app/assets/dedupe.js | 2 +- app/assets/delete-brand.js | 2 +- app/assets/split.js | 2 +- app/new_web_source/convert.html | 6 +- app/new_web_source/dedupe.html | 6 +- app/new_web_source/delete-brand.html | 6 +- app/new_web_source/split.html | 6 +- app/web_source/brand.html | 3 +- 21 files changed, 7149 insertions(+), 130 deletions(-) create mode 100644 app/amazon/__pycache__/detail_spider.cpython-39.pyc create mode 100644 app/amazon/detail_spider.py diff --git a/app/amazon/__pycache__/approve.cpython-39.pyc b/app/amazon/__pycache__/approve.cpython-39.pyc index 94b13e42f6532fc35aae33b3a1eda6485f531d88..d75c697034c7cb7ef10f4d96e063a68708db8ed5 100644 GIT binary patch delta 186 zcmdn+kMZU|M&3kTUM>b8us`r7Gi4+1dnaZlE~d@@o$3@A12)$sA7vD%VOYRe!#tZI zMQ$$BLPkc0$&;n-8Z3GKrT80WEv7d-v0>g-@5XJfG0^bY0K0jtQGZGI$voBPJ_l`Z5Y^&dUtv gX0+UVtfYgD@#tp%>KH~wkIidpf|(d2C)FDO05Hlt>i_@% delta 144 zcmcclk8#64M&3kTUM>b8=<|A&X|R#^y%RGd7xU)-PIU^54x8(ek1|dUPF3cYU}UJ} zVPvRMs$p2bm?Ag1HC12Uri87A)s_J)!dk;Rn;}JhF7rZ0MurrQU%nP4>+6-8>^RjGNJX^ZSwxHpau7E2?7{8QnHttqEpg44b8Xi<8TX|a*FM}x6t^DK?Wj1n~r3m9vdXEUTI&ShH2$jDG- zP{THXsYqaQtCk^u3?oCWAW%#Rq$)*e@=+~)`Gyj<8V*|qun21n2T-T-TxO8Y6pmm9 zO_j~U+GR}Qr9wcvp6uTJv}@thB`wbdS=1yH(M#hB6$Mpi3m;^S9>-Tap n9@)Iq!k3lNX7gv;U#yHto8LL>GcpEkmUG?9#8@-=j=K#2_)b2F delta 151 zcmX>&fpNwJM&3kTUM>b8nCtT@lVu}sj|OAO=2;q#89Ay9YS<<)6){Yns%6OU!^lu8 z$jDHoRKu`T(U zYs<(OH~F1jz-9;iUQWhCo6lMJvNBq2ma+TA%9yZO+(n;}F<`U1>s}_ts>!S#HUO*I BD{TM( diff --git a/app/amazon/__pycache__/detail_spider.cpython-39.pyc b/app/amazon/__pycache__/detail_spider.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a8f5b8f8f9065b151e56c9efdf7694da84ede73 GIT binary patch literal 52087 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 literal 0 HcmV?d00001 diff --git a/app/amazon/__pycache__/main.cpython-39.pyc b/app/amazon/__pycache__/main.cpython-39.pyc index f85175b6092ace254aa20dd0b2f9874105fbbf39..667b4bc0baf1febda19294ded6c6954812109559 100644 GIT binary patch delta 3569 zcma)9TX0jy89sX?9bGJ6v1N0$WE;@I#u#KE7+-=zxSL!^F;NIY=$v2~=^U}=2#hNS z61zAtmtYo}00B%&xwIL`)SXU}NoJbqLoW|)XFAQpndYH0HQ;Hc&18m$HZT4EJ+AGz z&P=WGr@j39@9y`1|L$sVh#MqR8F9}?-8YE8cYW5_N+E*UK)UietPU74h! z($Na>k0M#Z#+}V1FuKIGmDDeW`RFo)S^&#yCex~6#?u+P1RFUl#U4jWKe&`#mDZAL z?9Wo9S@FK>>J!hA-o~8J?L0^5lfAc0SGT12lsv_MM(lIs93v7g^oH2y%sG`pSlsEH zFd`^LtlhoT{YzdhW*K+w@sgbLilEH7>QG8=h(zcV4mT-fN?<_9k&Qw>=_AegZRxm2$g$gx9#=3cKZsa8*?1+CE za9t2`YOVw;V+(*FmO2WE(;Y0`hTPbzp0!plt-Hc#pj|Ary=m_cCE8 znZA)c_F3Vb1uoi%OIwYw24OA269~_;6GagcWIr#8K4)*&Pm8gm1Yr(BDMA?nXZtxU z1reS{*oLqR;ROKMO{e(y9*Y()T{#;oTfy`w{2L1Z1W6R9M_}}W;;%)2D|GCnm4LL4 z-7DR_W)l=;k+#8C)M<3-|C71i=7XxH_GD=5O&rw@&|Aww6&39HvR{)0Y+j&}EN4xD zDzcZo9HQX7ysa!~LW?KU#*^C03<>8Nkmdva{ zMeMCdSi#nm*R9}$Y{&W(E8c0W?1nDOjRJ}#723&$%PZ&3#u2i6mi@NekaTpG9&NA4 zx}*bGPOwiGD&?FZNEv@3ODW`0jFVEwo>+9G40)vrz+)Fc@WJ~xWIC7qYSC8jI;d{~ z9@n$7%G)745wm`P2k-vm;q@PnU%2$>{(Z`s!FAI4?2F3Zk^SsWFiBKa66$<YXRIn4M0`ZT*2S`co)0RbG~G}Ru{a&{ZKM$2)4 z3l8C=W@~FZ`#Q9A$0V20yhKVjRA67HsvNM1wHZQx8T99+s*z2Z$nRlv=f@Kxt{sbM z@w7@`VrrEf38MA)(b@yn8C^5fr~~cm^996=Yy#8W&g>BTtSVSKBfnE%{TueU z>aX)&M~5d7(g?31@O6bozpCEul#gHoik@}?WHGD8J~=UV`_$OYfrsZ#j$Qe5?A|Y$ zf;7&Qa1EjC&2X^DK=a91Qj>iYZX>PiU*WjKW7Na;%R|8yu(ApaJxdenresRxyWE3A z_akJPZ&?_WA6d4%RfPt*cuLVUi55JP$FS53V7aOK3UJazU&W^52)3x%wPmg35c^`; z+$}uIzkAC#hHn`6O8Wt#1;){&ndqA2bO3vHvew#KS%aeGjT=cVmNeBgJ&j#6h&};r zJJ|W!^D>|H0-Ep{rq~|Fw(|%KAvD@i_t+(IXDw{Ys``}_o6jK3Bo^BS5#B(U$SiuA z-Cm`T2=hl8$VS!@sU!PXcVs>3VYeb3tlMPq96XwPX()Xbh3V>{jFM^*pzxg0Tv%Fe3CU!pvwun)!RHf@L; z52F#kTKSk~unGYYs1pI7S`=Rv{9$4_lA1|VSS>_2fq-hIE`+xbxL$a^-NNeB^t^;W z2WSPr9QZft1))&z5U1!VF7bKR1@bG(nY%qiDwy2<&k0p}xH-jjS;gDcV+Zs&Rkms- zJS4Ii)7~hbiEDHh`hNjHCYC#`Ye~4#rmX>|x18yCQo9A0tWgA2!2wSt;)joqBfW<< zo>;6D&0;Zmi5*(*`3C#xQxBBVcskyzYxRn1#*?X-!G9m|*IYDjqRZ6v6u*c0-D__F q9n;$gvyftWn$xhNv;@||h(9{Ypwo1~bio}DfCRL+WdB{tvs+IclFnvj-K%tcysS*!Wo3`iN zLAG&SsUUxQ=G=47z2`gMy)*xqBCkx5uoey%2=Fia^q-T*u7=l>&#pH9xFsEn$B57^ z=pj9PNzlWSV!T=})Qc_&@fu^JUOXbwPmP*Mfe1QzUQkLFVkAHoc8b3c$tLFUc98Og z{oWqZTnm}0g3tiq1ngwmuxu@zrJK;np$}wn^ z$xCkwdg-i3Uo$Tf;e>GZNxe)jza-?zAz_k?5%frc9lSy=?k2*ROoY+hb|^1T5?HxT zkGS?Z{>1Y}UC-OXtf*JGIZq1u+A;Yh8FKUA7NG^Qo)GdvKWwUUo)9pHJ&^De{tkzs zly%eG3*%4Vc&3RbUmkn;f5o=Ia=`m~cFjLYs#zq^Eh-YT0=)~r3lx!7l@AaKxnUgtF937?!2lnl(b7 zMt8ubTEaN3B}SZrGbT-IwrX5RC?3jH)C(cB58?5B&@S)|v5iH$NiQ2HsvmzBo=5v_ z!6vq7dvpR)@&L1vF52EanIs?v&#Z@c#FH1-3Me4pS=Oa#GUm;D=X`nM_Uo}ZUU$w3 zA#(`C;=efeNGjO1<+;7G9hfU%q2ljHCEAAjZAaLSumj;J`*m>}sbW$|yw9a2NK0^_ z6k!cQ83J#|m(Z$0coqS9qR$~515kX+sCk~O)-g*d3MWlP-CoWk-=6@a6K*ykwF)n0j=RD5Z&n}mLM%J;jkt))} zu10D|oc%CT8^QAE0D$AOY%`lRbcN6t*hx|vW@rluRZQ;;zX9Ucag8M+ncl;a%9HZItXG;Em}8o?=E zH^OC;_0(+cTck4{Or%W9P@y~2P$Dk3E=ia#gZTo~uyQFIDK;@(2(Jt+b5YG`X@j0* zAJr&rT%i{++7HoLGh-QX4_x&WB^M9#4X9QwfhXQQ#4%Q}F;=$XC=WyQC#-MdA1f!o zqL&ax5XKSszG4gAwY^f%MhA)-+CE#qo~Z06^|d6+KCO=xpGEg#+bCtl%0AM;o>erN zx8of9K$(i|fhecYGIKOx98RVTUd?fwih`vU(;DhQ%u@|pIuqbfN*;+62L};&)6S!H z0l@K5;|$b3MDyqxLwLma!-me&Nqi1q+~UQjS;>sD#-)4$hgU5Z2Y9hBp!Ictc%gMZ zX(xsj`Ft5i`q+)eMkNKN6Tr-B(l*j`3WrvZ{1W(j*n`Gv$^?#HL*OecG5sd`t{_}R zh%MZ1dgzsTvOVn9w&vC>x?e|FNjCbvf$&X)M+b{ev43sT$u^c~Yas{N^|mI`&pvM3 zL(Z`;+KxoO3ZeYy+=M0%MtG>fCFUCGmeM-ZCWk9MDxx$I^aw(Qv_!U0b2tq!ik zS*H;wo7r0%buU_pehpl4-;e>9AGP4x{q5cL-D&5xSPdXo*YdrYw#ql zv{-5J(x)xwQfEW^`pF3UWZ&=WxVA8lBafWd=%BUofTC`%vXA%QsNH}`d4D#d_4q+{ zBz&jNveBn%NIjcrUAoU_l zBXAY)Q*;|2mzL*N9r~gGrSNAp3qq0LCz9wdDJ}3n83|WJ*ua5m5@izyJ}-2&=I7z` z2pc;X-Nnn|dAZJ>!)(U@6yo^OW+n-5q-87OVvdy7l9}(aUmjfh#QXT{S5@?=s#5Fr zj3>Fp#6$Obf?8S|H8ah&X{Pvlk-rPw4d7(@4#FxWIsT5cspnEgCmt-Tf%SD&vZ1a* KZ^U2dC;tIBtqGq1 diff --git a/app/amazon/__pycache__/match_action.cpython-39.pyc b/app/amazon/__pycache__/match_action.cpython-39.pyc index d40d3792cfd33e930a855d76d1a340a1f99da12e..39ebc21a10a2fa5abc6602bc077b64564ac018fd 100644 GIT binary patch delta 161 zcmZ2Hjq%JhM&3kTUM>b8h*o-&IcX#Be=Wv@&Ai(C86|2M7BJQ@&t^!Go6EG2k&&Uw zpoV<{W6_(*S9A>dEf^VU1%P5oAXO>ylSOp({^1mkI&xda`@>)2@Y2m$W>e(Drm)&$EsRn>XugGBQR@zH8vc%qYOLS;O$R FBmmqhGP(c& delta 119 zcmX>zjdAfbM&3kTUM>b8sP}r6nY5AjzZPS_W?t?6j2u-4HS7}@i|$N*qGQOf!N^c6 zz{pUgRKu`%Tn~QVi_@% diff --git a/app/amazon/__pycache__/price_match.cpython-39.pyc b/app/amazon/__pycache__/price_match.cpython-39.pyc index 95a1128b6cc59e5358a3c22e07f03929792d2a95..95e7dc2b46de9963cee9b85a19b1878ba3dd36da 100644 GIT binary patch delta 12243 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 diff --git a/app/amazon/approve.py b/app/amazon/approve.py index 61e3545..54d8e1e 100644 --- a/app/amazon/approve.py +++ b/app/amazon/approve.py @@ -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) diff --git a/app/amazon/asin_status.py b/app/amazon/asin_status.py index 5415575..9160f21 100644 --- a/app/amazon/asin_status.py +++ b/app/amazon/asin_status.py @@ -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) diff --git a/app/amazon/detail_spider.py b/app/amazon/detail_spider.py new file mode 100644 index 0000000..0558bbb --- /dev/null +++ b/app/amazon/detail_spider.py @@ -0,0 +1,6907 @@ +import json +import sys +import os +import io +# sys.stdout.reconfigure(encoding='utf-8') + +import time +import re +import traceback +from datetime import datetime +from DrissionPage import Chromium, ChromiumOptions +import requests + +from amazon.del_brand import AmamzonBase, kill_process +from amazon.tool import show_notification,get_shop_info,remove_special_characters,split_currency_values + +from config import runing_task, runing_shop,base_dir,DELETE_BRAND_API_BASE + + +class ChromeAmzone: + mark_name = "亚马逊详情采集" + country_info = { + "英国": { + "url": "https://www.amazon.co.uk/dp/B0CJ8SNXXV", + "zip_code": "SW1A 1AA", + "mark": "SW1A 1" + }, + "德国": { + "url": "https://www.amazon.de/dp/B0CC8CW9G2?th=1", + "zip_code": "10115" + }, + "法国": { + "url": "https://www.amazon.fr/dp/B0FRG1MJ8H?th=1", + "zip_code": "75001" + }, + "西班牙": { + "url": "https://www.amazon.es/dp/B08ZXVNYNN", + "zip_code": "28001" + }, + "意大利": { + "url": "https://www.amazon.it/dp/B0D1P17T2Q", + "zip_code": "20121" + } + } + + def __init__(self): + """ + 杀死当前谷歌浏览器进程,并使用 drissionpage 启动谷歌浏览器,使用系统安装的浏览器默认用户文件夹 + """ + # 杀死现有的Chrome进程 + print("正在关闭现有的chromium浏览器进程...") + os.system('taskkill /f /t /im chrome.exe') + time.sleep(2) + + print("正在启动chromium浏览器...") + # 配置浏览器选项 + co = ChromiumOptions() + user_data_path = os.path.join(base_dir, "user_data", "chrome_data") + if not os.path.exists(user_data_path): + os.makedirs(user_data_path, exist_ok=True) + co.set_user_data_path(user_data_path) + co.set_local_port(port=19897) + self.browser = Chromium(co) + self.tab = self.browser.latest_tab + print("Chrome浏览器启动成功") + + def close_init_popup(self): + """ + 关闭所有的初始化弹窗 + """ + self.tab.wait.doc_loaded(timeout=60, raise_err=True) + footbar = self.tab.eles('xpath://footer[@class="el-dialog__footer"]', timeout=5) + if len(footbar) > 0: + do_not_remind = footbar[0].eles('xpath:.//input[@class="el-checkbox__original"]') + if len(do_not_remind) > 0: + do_not_remind[0].check() + resume_immediately = footbar[0].eles('xpath:.//button') + if len(resume_immediately) > 0: + resume_immediately[0].click() + + self.tab.wait.doc_loaded(timeout=60, raise_err=True) + accept_btn = self.tab.eles('xpath://input[@id="sp-cc-accept"]', timeout=5) + if len(accept_btn) > 0: + accept_btn[0].click() + + def run(self, country, asin): + """ + 运行亚马逊详情采集任务 + + Args: + country: 国家名称(如:英国、德国、法国、西班牙、意大利) + asin: 亚马逊商品ASIN码 + + Returns: + dict: 包含采集到的数据 + """ + try: + # 验证国家是否支持 + if country not in self.country_info: + error_msg = f"不支持的国家: {country},支持的国家有: {list(self.country_info.keys())}" + print(error_msg) + show_notification(error_msg, "error") + return None + + # 获取国家配置 + country_config = self.country_info[country] + zip_code = country_config["zip_code"] + mark = country_config.get("mark") + + # 1. 根据国家和ASIN拼接链接 + base_url = country_config["url"] + # 提取域名部分 + domain = base_url.split("/dp/")[0] + # 拼接新的URL + product_url = f"{domain}/dp/{asin}" + print(f"正在访问: {product_url}") + + # 打开链接 + self.tab.get(product_url) + time.sleep(3) # 等待页面初步加载 + self.tab.wait.doc_loaded(timeout=30, raise_err=False) + + self.close_init_popup() + # 2. 切换国家/设置邮编 + print(f"正在检查并设置邮编: {zip_code},标识: {mark}") + self._set_zip_code(zip_code, mark) + + # self.tab.wait.doc_loaded(timeout=5, raise_err=False) + + # 3. 抓取数据 + print("正在抓取商品数据...") + data = self._scrape_data() + + # 添加基本信息 + data['country'] = country + data['asin'] = asin + data['url'] = product_url + data['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + + print(f"数据抓取完成: {json.dumps(data)}") + return data + + except Exception as e: + error_msg = f"运行出错: {traceback.format_exc()}" + print(error_msg) + show_notification(f"采集失败: {str(e)}", "error") + return None + + def _set_zip_code(self, zip_code, mark=None): + """ + 设置邮编 + + Args: + zip_code: 目标邮编 + """ + try: + # 检查当前邮编 + zip_display = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) + + if zip_display: + current_text = zip_display.text + # print(f"当前地址信息: {current_text}") + # 先检查标识 + if mark is not None and mark in current_text: + print(f"邮编检测到标识: {mark},无需修改") + return True + # 检查是否已经包含目标邮编 + if zip_code in current_text: + print(f"邮编已经设置为: {zip_code},无需修改") + return True + + # 需要设置邮编 + print(f"正在设置邮编为: {zip_code}") + + # 点击地址选择按钮 + location_link = self.tab.ele('xpath://a[@id="nav-global-location-popover-link"]', timeout=10) + if not location_link: + print("找不到地址设置按钮") + return False + + location_link.click() + time.sleep(1) + + # 等待邮编输入框出现 + zip_input = self.tab.ele('xpath://input[@id="GLUXZipUpdateInput"]', timeout=10) + if not zip_input: + print("找不到邮编输入框") + return False + + # 输入邮编 + zip_input.input(zip_code, clear=True) + time.sleep(0.5) + + # 点击提交按钮 + submit_btn = self.tab.ele('xpath://input[@aria-labelledby="GLUXZipUpdate-announce"]', timeout=10) + if not submit_btn: + print("找不到提交按钮") + return False + + submit_btn.click() + + continue_btn = self.tab.eles('xpath://div[@class="a-popover-footer"]//input[@id="GLUXConfirmClose"]', + timeout=10) + if len(continue_btn) > 0: + continue_btn[0].click() + + # 等待提交按钮消失(表示请求已发送) + print("等待邮编更新...") + time.sleep(2) + + # 等待页面加载完成 + self.tab.wait.doc_loaded(timeout=30, raise_err=False) + time.sleep(2) + + # 验证邮编是否设置成功 + zip_display_after = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) + if zip_display_after: + updated_text = zip_display_after.text + # print(f"更新后的地址信息: {updated_text}") + + if zip_code in updated_text: + print(f"邮编设置成功: {zip_code}") + return True + else: + # print(f"邮编设置可能失败,当前显示: {updated_text}") + return False + + return True + + except Exception as e: + print(f"设置邮编时出错: {traceback.format_exc()}") + return False + + def _scrape_data(self): + """ + 抓取商品数据 + + Returns: + dict: 抓取到的数据 + """ + data = { + 'image_url': "", + 'title': "" + } + + try: + # 等待页面加载 + # time.sleep(3) + title_ele = self.tab.ele('xpath://h1[@id="title"]',timeout=30) + title = title_ele.text + data["title"] = title + imge_ele = self.tab.ele('xpath://div[@id="imgTagWrapperId"]//img',timeout=20) + image_url = imge_ele.attr("src") + data["image_url"] = image_url + return data + + except Exception as e: + print(f"抓取数据时出错: {traceback.format_exc()}") + return data + + def close(self): + """关闭浏览器""" + try: + if self.browser: + self.browser.quit() + print("浏览器已关闭") + except Exception as e: + print(f"关闭浏览器时出错: {str(e)}") + + +class SpiderTask: + mark_name = "亚马逊采集" + + def __init__(self, user_info: dict = None): + """初始化审批任务处理器 + + Args: + user_info: 用户信息字典,包含 company, username, password + """ + self.user_info = user_info or {} + self.running = True + + def log(self, message: str, level: str = "INFO"): + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + if level == "ERROR": + show_notification(message, "error") + print(f"[{timestamp}] [PriceTask] [{level}] {message}") + + def process_task(self, task_data: dict): + """处理审批任务主入口 + + Args: + task_data: 任务数据 + """ + try: + data = task_data.get("data", {}) + task_id = data.get("taskId") + items = data.get("rows", []) + + # 用于测试 + limit = data.get("limit", None) + + if not task_id: + self.log("任务ID为空,跳过", "WARNING") + return + + + self.log(f"开始处理爬取任务 {task_id},{len(items)} 个任务") + + from config import runing_task + runing_task[task_id] = { + "status": "running", + "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "total_shops": 1, + "processed_shops": 0, + "total_countries": len(items) , + "processed_countries": 0, + "total_asins": 0, + "processed_asins": 0, + "success_count": 0, + "failed_count": 0, + "stop_requested": False + } + + # 检查是否收到暂停请求 + if task_id in runing_task and runing_task[task_id].get("stop_requested", False): + self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") + runing_task[task_id]["status"] = "stopped" + return + max_retry = 3 + show_notification(f"开始爬取数据", "info") + chrome = ChromeAmzone() + try: + for index,i in enumerate(items): + asin = i.get("asin") + country = i.get("country") + return_data = None + for _ in range(max_retry): + try: + return_data = chrome.run(country, asin) + self.log(f"抓取结果->{return_data}") + break + except Exception as e: + if "与页面的连接已断开" in str(e): + chrome = ChromeAmzone() + # 提交结果 + # 'image_url': "", + # 'title': "" + + item_data = { + "id": i.get("id"), + "asin": asin, + "country": country, + "url": return_data.get("image_url"), + "title": return_data.get("title"), + } + # task_id: int, chunkIndex:int,chunkTotal: int, country_code: str, asin: str, status: dict,error:str="", + # item_data:dict={}, + is_done = index == len(items)-1 + self.post_result(task_id=task_id,chunkIndex=index+1,chunkTotal=len(items), + asin=asin,item_data=item_data,is_done=is_done) + + try: + chrome.close() + except Exception as e: + print("退出浏览器出错",e) + # 更新已处理店铺数 + if task_id in runing_task: + runing_task[task_id]["processed_shops"] += 1 + except Exception as e: + import traceback + self.log(f"处理店铺 {task_id} 失败: {str(e)}", "ERROR") + self.log(traceback.format_exc(), "ERROR") + + # 更新任务状态 + if task_id in runing_task: + if runing_task[task_id].get("stop_requested", False): + runing_task[task_id]["status"] = "stopped" + self.log(f"任务 {task_id} 已被暂停!") + else: + runing_task[task_id]["status"] = "completed" + self.log(f"任务 {task_id} 处理完成!") + + except Exception as e: + import traceback + self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") + if task_id: + from config import runing_task + if task_id in runing_task: + runing_task[task_id]["status"] = "failed" + runing_task[task_id]["error"] = str(e) + + def post_result(self, task_id: int, chunkIndex:int,chunkTotal: int, asin: str, error:str="", + item_data:dict={}, + is_done: bool = False): + """回传处理结果到API + """ + + url = f"{DELETE_BRAND_API_BASE}/api/appearance-patent/tasks/{task_id}/result" + + payload ={ + "submissionId": f"{int(time.time())}", + "chunkIndex": chunkIndex, + "chunkTotal": chunkTotal, + "error": error, + "items": [ + item_data + ], + "done": is_done + } + + max_retries = 3 + for retry in range(max_retries): + try: + print("================【详情采集】=====================") + self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") + self.log(f"回传URL: {url}") + self.log(f"回传数据: {payload}") + response = requests.post( + url, + json=payload, + headers={"Content-Type": "application/json"}, + timeout=30, + verify=False + ) + self.log(f"回传结果: {response.text}") + data = response.json() if response.text else {} + if response.status_code == 200 and isinstance(data, dict) and data.get("success"): + self.log(f"结果回传成功: {asin} - {item_data}") + return + else: + self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") + print("=====================================") + + except Exception as e: + self.log(f"调用API异常: {str(e)}", "ERROR") + print("=====================================") + + # 如果还有重试机会,等待后继续 + if retry < max_retries - 1: + time.sleep(2) + + self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") + raise RuntimeError("已达到最大重试次数,结果回传最终失败") + +if __name__ == '__main__': + spide = SpiderTask() + task_data = { + "success": True, + "message": "操作成功", + "data": { + "taskId": 4188, + "sourceFilename": "17.xlsx", + "totalRows": 1601, + "acceptedRows": 716, + "droppedRows": 885, + "aiPrompt": "请帮我排查以下亚马逊商品在英国及欧洲地区是否存在知识产权侵权风险。 请直接给出明确结论(有侵权风险 或 未发现明显侵权风险),并严格按照以下三个维度提供精简的排查理由: 外观维度: 评估产品外形、图案设计是否与欧洲/英国常见外观专利雷同。 专利维度: 评估产品的核心技术或物理结构是否存在侵权可能。 标题维度: 排查标题中是否包含大牌商标、敏感词或版权保护词汇。 结论:XX", + "items": [ + { + "rowIndex": 2, + "sourceId": "1", + "displayId": "1", + "asin": "B0D792ND9V", + "country": "英国", + "url": "", + "title": "低" + }, + { + "rowIndex": 3, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0D14L34S7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 7, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0CWQFZMGY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 9, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0CX87XXWJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 10, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0CR3PMR8L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 11, + "sourceId": "6", + "displayId": "6", + "asin": "B0DK3L6FD4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 12, + "sourceId": "8", + "displayId": "8", + "asin": "B0D9QNV6FT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 13, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0DBZG716J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 14, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0CX8K4F8Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 15, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0C4KXJWW1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 28, + "sourceId": "13", + "displayId": "13", + "asin": "B0D62LNNKQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 29, + "sourceId": "14", + "displayId": "14", + "asin": "B0DK3K3GF5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 30, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0C1HN8GY6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 57, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0B71WMDDF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 58, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0DSZNF73N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 60, + "sourceId": "19", + "displayId": "19", + "asin": "B0897Y5QDC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 61, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0FNCLNS68", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 62, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B009U2SCMW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 67, + "sourceId": "24", + "displayId": "24", + "asin": "B0FBLY2ZRD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 68, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B08LP7DW3M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 69, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0FPBZLD6R", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 80, + "sourceId": "30", + "displayId": "30", + "asin": "B09LV1TNHK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 81, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0DSKS214Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 86, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0BZBW8KL5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 88, + "sourceId": "3", + "displayId": "3", + "asin": "B0CR3LS3R7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 89, + "sourceId": "4", + "displayId": "4", + "asin": "B097TS2MNQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 90, + "sourceId": "5", + "displayId": "5", + "asin": "B09LV4WGTR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 91, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0916ZQP1V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 93, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0C9WHZ67N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 96, + "sourceId": "9", + "displayId": "9", + "asin": "B0F8QKVS1D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 97, + "sourceId": "10", + "displayId": "10", + "asin": "B0D49974HV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 98, + "sourceId": "11", + "displayId": "11", + "asin": "B0F2DXMKVF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 99, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B08YX48NZ2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 100, + "sourceId": "14", + "displayId": "14", + "asin": "B0BGM3HF9C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 101, + "sourceId": "15", + "displayId": "15", + "asin": "B0CJJM9KZV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 102, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B09HDSTGT4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 103, + "sourceId": "17", + "displayId": "17", + "asin": "B0CX9HK5NL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 104, + "sourceId": "18", + "displayId": "18", + "asin": "B0C2BV83D3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 105, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0D5WDK7GW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 107, + "sourceId": "20", + "displayId": "20", + "asin": "B09NR1PZYD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 108, + "sourceId": "21", + "displayId": "21", + "asin": "B0DC45N1Y8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 109, + "sourceId": "23", + "displayId": "23", + "asin": "B01AVHJQY2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 110, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0F3VSJ9Q2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 117, + "sourceId": "27", + "displayId": "27", + "asin": "B0CLXCXW6W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 118, + "sourceId": "28", + "displayId": "28", + "asin": "B07PSPN1XH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 119, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B09PHQYR6Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 122, + "sourceId": "30", + "displayId": "30", + "asin": "B0CT2H94WV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 123, + "sourceId": "1", + "displayId": "1", + "asin": "B0FRRK9V73", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 124, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0B3RNHXV8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 125, + "sourceId": "4", + "displayId": "4", + "asin": "B09FF115TW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 126, + "sourceId": "5", + "displayId": "5", + "asin": "B0CYGXDWBT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 127, + "sourceId": "6", + "displayId": "6", + "asin": "B0F9FT3ZPY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 128, + "sourceId": "7", + "displayId": "7", + "asin": "B0F295JTQZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 129, + "sourceId": "8", + "displayId": "8", + "asin": "B0FPJZ1N51", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 130, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B08B8SP7XT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 131, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B002P7HGEO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 132, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B09X268FXC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 134, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0170OT3X8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 136, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0859793H1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 138, + "sourceId": "17", + "displayId": "17", + "asin": "B0FP8KHCPX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 139, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B09H6KR87N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 146, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0D9778Q65", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 147, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0CPJCBZR8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 148, + "sourceId": "21", + "displayId": "21", + "asin": "B0CZ63NGNQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 149, + "sourceId": "22", + "displayId": "22", + "asin": "B0CR4795W6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 150, + "sourceId": "23", + "displayId": "23", + "asin": "B0CR45ZB5Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 151, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0CYB255ST", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 153, + "sourceId": "25", + "displayId": "25", + "asin": "B0BMYWFKTF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 154, + "sourceId": "26", + "displayId": "26", + "asin": "B0BMYTPRD6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 155, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0DK1MGDZM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 157, + "sourceId": "28", + "displayId": "28", + "asin": "B006FUXS30", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 158, + "sourceId": "30", + "displayId": "30", + "asin": "B00BLPUXCI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 159, + "sourceId": "1", + "displayId": "1", + "asin": "B09N79DR4C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 160, + "sourceId": "2", + "displayId": "2", + "asin": "B006O74WTI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 161, + "sourceId": "3", + "displayId": "3", + "asin": "B006O75DIC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 162, + "sourceId": "4", + "displayId": "4", + "asin": "B09323MXYP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 163, + "sourceId": "5", + "displayId": "5", + "asin": "B00K2NTEPC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 164, + "sourceId": "6", + "displayId": "6", + "asin": "B09C19Y6B3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 165, + "sourceId": "7", + "displayId": "7", + "asin": "B00L2HK0S2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 166, + "sourceId": "8", + "displayId": "8", + "asin": "B00666DQBW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 167, + "sourceId": "9", + "displayId": "9", + "asin": "B00666FLII", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 168, + "sourceId": "10", + "displayId": "10", + "asin": "B00666GVM8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 169, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B07KWJCVVN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 173, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B00F0KAGKO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 179, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0C695NBMR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 180, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0F2FXYCG4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 182, + "sourceId": "16", + "displayId": "16", + "asin": "B0FPGC8Z84", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 183, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B0D8HXBGGB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 184, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0DDG8GJP9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 188, + "sourceId": "19", + "displayId": "19", + "asin": "B0FLCZVDDH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 189, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B07WZZW6V9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 191, + "sourceId": "21", + "displayId": "21", + "asin": "B0GT3SJ6J1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 192, + "sourceId": "22", + "displayId": "22", + "asin": "B077R1GRW1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 193, + "sourceId": "23", + "displayId": "23", + "asin": "B0D2TMYX23", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 194, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B00AXTKYCM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 195, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0D45CB5SS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 197, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0852JR7RD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 198, + "sourceId": "27", + "displayId": "27", + "asin": "B0GR9F93JL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 199, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0CCJ3NY78", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 200, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0D1V26VBG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 201, + "sourceId": "1", + "displayId": "1", + "asin": "B0CN5VVWB2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 202, + "sourceId": "2", + "displayId": "2", + "asin": "B0DLNJTKFB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 203, + "sourceId": "3", + "displayId": "3", + "asin": "B0CSD7S964", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 204, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0GLP8L4TT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 205, + "sourceId": "5", + "displayId": "5", + "asin": "B0FGJB6LLV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 206, + "sourceId": "6", + "displayId": "6", + "asin": "B0DZ67MYZN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 207, + "sourceId": "7", + "displayId": "7", + "asin": "B0G3XP9VYB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 208, + "sourceId": "8", + "displayId": "8", + "asin": "B0FNWMRMSZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 209, + "sourceId": "9", + "displayId": "9", + "asin": "B0FNWP3K72", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 210, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0DQTMRNLC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 212, + "sourceId": "11", + "displayId": "11", + "asin": "B0DZ62KT5N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 213, + "sourceId": "13", + "displayId": "13", + "asin": "B0DZ65VCDC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 214, + "sourceId": "16", + "displayId": "16", + "asin": "B0DZ67P85P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 215, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B0F6LRCZXW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 216, + "sourceId": "18", + "displayId": "18", + "asin": "B0DPYVJMLK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 217, + "sourceId": "19", + "displayId": "19", + "asin": "B0FDKZJTY5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 218, + "sourceId": "20", + "displayId": "20", + "asin": "B0D9VFN9QW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 219, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0BW46XZ2G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 222, + "sourceId": "22", + "displayId": "22", + "asin": "B0FLCBQ92M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 223, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0F6JW61SR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 225, + "sourceId": "24", + "displayId": "24", + "asin": "B0CNZ27HCF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 226, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B001DKRB8A", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 232, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B00NH5DWIW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 236, + "sourceId": "28", + "displayId": "28", + "asin": "B01IOKEOGS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 237, + "sourceId": "29", + "displayId": "29", + "asin": "B08YJVVPBK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 238, + "sourceId": "30", + "displayId": "30", + "asin": "B0FG29NPDK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 239, + "sourceId": "1", + "displayId": "1", + "asin": "B0FRFHFXXZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 240, + "sourceId": "3", + "displayId": "3", + "asin": "B0FMQ5G18V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 241, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0DPDKD5PB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 242, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0FS6JDGNW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 248, + "sourceId": "8", + "displayId": "8", + "asin": "B0DZBM5VRX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 249, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0D4Q2KB8X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 250, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B098B3XKRS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 251, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B09F9JM8F9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 252, + "sourceId": "14", + "displayId": "14", + "asin": "B08H5M3ZQ7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 253, + "sourceId": "15", + "displayId": "15", + "asin": "B0DG3NXCCF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 254, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0FJX2FSM1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 256, + "sourceId": "17", + "displayId": "17", + "asin": "B089KHDH15", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 257, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0CPWP6W5M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 264, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0D4LXTCSZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 265, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0CK682F4T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 267, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0B9CGJDBV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 268, + "sourceId": "23", + "displayId": "23", + "asin": "B0DV55H9DD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 269, + "sourceId": "25", + "displayId": "25", + "asin": "B0FJ8B8RJS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 270, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0D426K41D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 275, + "sourceId": "27", + "displayId": "27", + "asin": "B0CTD4BF7S", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 276, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0CGXGQ43L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 279, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0BDM3B6LY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 283, + "sourceId": "1", + "displayId": "1", + "asin": "B0FS1SJGJ5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 284, + "sourceId": "2", + "displayId": "2", + "asin": "B0FJ1RH4JV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 285, + "sourceId": "3", + "displayId": "3", + "asin": "B0B9MBTX28", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 286, + "sourceId": "4", + "displayId": "4", + "asin": "B0FV2VLSX1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 287, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0BRYKW1GD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 289, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0CT5G9YWM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 291, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0D927DZ6B", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 294, + "sourceId": "9", + "displayId": "9", + "asin": "B0DSDY3G29", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 295, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0CWRRSV9H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 296, + "sourceId": "11", + "displayId": "11", + "asin": "B0DNDTT9Z4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 297, + "sourceId": "13", + "displayId": "13", + "asin": "B0CP5VD5SG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 298, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0BV2Q24YK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 300, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0F3JD29KW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 302, + "sourceId": "16", + "displayId": "16", + "asin": "B0C818XVYT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 303, + "sourceId": "17", + "displayId": "17", + "asin": "B0FJRYQ3QV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 304, + "sourceId": "18", + "displayId": "18", + "asin": "B0CP3NYG8J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 305, + "sourceId": "19", + "displayId": "19", + "asin": "B0F6C7XH75", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 306, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0FXX9N5VH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 308, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0CFJPCSDP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 310, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0FQJHS1MZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 311, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0D5VJN99L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 313, + "sourceId": "26", + "displayId": "26", + "asin": "B07MCDWVJG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 314, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0CKYJCJGD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 319, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0CQXPR4H4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 321, + "sourceId": "29", + "displayId": "29", + "asin": "B08S2913J7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 322, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0CXPL3GSW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 323, + "sourceId": "1", + "displayId": "1", + "asin": "B0D7JVZWZF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 324, + "sourceId": "2", + "displayId": "2", + "asin": "B0FKMXP3ZR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 325, + "sourceId": "3", + "displayId": "3", + "asin": "B0FGP7YJC8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 326, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0F9PDZTCJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 328, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0CTLXM3C6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 331, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0CSYB8BPK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 335, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B01I1CEEXW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 340, + "sourceId": "8", + "displayId": "8", + "asin": "B0G2Y49LCY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 341, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0F3HK55L6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 343, + "sourceId": "10", + "displayId": "10", + "asin": "B0GWJ69JK1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 344, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B09Z877C17", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 345, + "sourceId": "12", + "displayId": "12", + "asin": "B0GLDX9NB1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 346, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0FPC1Y19B", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 348, + "sourceId": "14", + "displayId": "14", + "asin": "B0C65438CP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 349, + "sourceId": "17", + "displayId": "17", + "asin": "B0F6MNZB6F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 350, + "sourceId": "18", + "displayId": "18", + "asin": "B0BVPLLLRP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 351, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0FK2B5FK2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 353, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0BPNFMKQV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 354, + "sourceId": "22", + "displayId": "22", + "asin": "B0G4BLRDW6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 355, + "sourceId": "23", + "displayId": "23", + "asin": "B0F93QCQF1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 356, + "sourceId": "24", + "displayId": "24", + "asin": "B0FHHPYP9K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 357, + "sourceId": "28", + "displayId": "28", + "asin": "B0F1K9KDX6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 358, + "sourceId": "29", + "displayId": "29", + "asin": "B0F52ZXD55", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 359, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B07GDGSKK6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 361, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B08BPHJ34D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 362, + "sourceId": "2", + "displayId": "2", + "asin": "B07ZFWRH75", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 363, + "sourceId": "3", + "displayId": "3", + "asin": "B0G5PVP3Y3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 364, + "sourceId": "4", + "displayId": "4", + "asin": "B0FXXLPC1T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 365, + "sourceId": "5", + "displayId": "5", + "asin": "B0GQB1K38X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 366, + "sourceId": "6", + "displayId": "6", + "asin": "B0C1TCDZ5N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 367, + "sourceId": "8", + "displayId": "8", + "asin": "B0FHD3QCLW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 368, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0F1THT9XW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 370, + "sourceId": "11", + "displayId": "11", + "asin": "B0DYJ8743N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 371, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0FD3Q2RGP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 373, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0BV66T3PQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 374, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0CDVYLTB4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 383, + "sourceId": "16", + "displayId": "16", + "asin": "B0CNKGFWKR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 384, + "sourceId": "17", + "displayId": "17", + "asin": "B0D4VQF22F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 385, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0C5TBR8LB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 387, + "sourceId": "19", + "displayId": "19", + "asin": "B0DDH3G9PG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 388, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0D8VRMWP2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 390, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0BFWXWNTC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 395, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B096ZCL4JX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 399, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0CFDXR5FC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 400, + "sourceId": "25", + "displayId": "25", + "asin": "B0G6DN5QC7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 401, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0CNRL9R1F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 402, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0BJK6D2D4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 403, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0DPFDTL7W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 405, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0G5N9KGXC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 406, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0F73X9X8D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 408, + "sourceId": "1", + "displayId": "1", + "asin": "B0CJTJB8PV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 409, + "sourceId": "2", + "displayId": "2", + "asin": "B0FBGD3QJ2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 410, + "sourceId": "3", + "displayId": "3", + "asin": "B0F98TGSQ1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 411, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0F329ZXH5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 412, + "sourceId": "5", + "displayId": "5", + "asin": "B0G191SX5F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 413, + "sourceId": "6", + "displayId": "6", + "asin": "B0F7XT5TNY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 414, + "sourceId": "7", + "displayId": "7", + "asin": "B0FVS7K78Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 415, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0FYFZBQLT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 418, + "sourceId": "10", + "displayId": "10", + "asin": "B0FG2LHWB3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 419, + "sourceId": "11", + "displayId": "11", + "asin": "B0F9WX88T1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 420, + "sourceId": "12", + "displayId": "12", + "asin": "B0F7XNDBNN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 421, + "sourceId": "14", + "displayId": "14", + "asin": "B0DT7GV9NS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 422, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0DKF26TYN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 423, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0D1FP339J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 424, + "sourceId": "20", + "displayId": "20", + "asin": "B0CNCBQCMG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 425, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0CHRR45X7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 427, + "sourceId": "23", + "displayId": "23", + "asin": "B0C1RPB8BQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 428, + "sourceId": "24", + "displayId": "24", + "asin": "B0BVPPBH7D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 429, + "sourceId": "25", + "displayId": "25", + "asin": "B0BHQKQMG8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 430, + "sourceId": "26", + "displayId": "26", + "asin": "B0C7QQPNC9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 431, + "sourceId": "27", + "displayId": "27", + "asin": "B0FHKT5CBC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 432, + "sourceId": "29", + "displayId": "29", + "asin": "B0DR5XVMN7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 433, + "sourceId": "30", + "displayId": "30", + "asin": "B08HPS68Q4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 434, + "sourceId": "1", + "displayId": "1", + "asin": "B0C4KLQPDZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 435, + "sourceId": "2", + "displayId": "2", + "asin": "B0F6TT21VN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 436, + "sourceId": "3", + "displayId": "3", + "asin": "B08MFB5W4Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 437, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B07C9Z5CG5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 441, + "sourceId": "5", + "displayId": "5", + "asin": "B07589LNBP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 442, + "sourceId": "6", + "displayId": "6", + "asin": "B08HRLZVX2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 443, + "sourceId": "7", + "displayId": "7", + "asin": "B08K7B3T6P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 444, + "sourceId": "8", + "displayId": "8", + "asin": "B09T9YYYTS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 445, + "sourceId": "9", + "displayId": "9", + "asin": "B081ZVNH98", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 446, + "sourceId": "10", + "displayId": "10", + "asin": "B0F6T4XMXY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 447, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B07QH4X4Y5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 449, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B096S27HMH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 460, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0FB9DWYXF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 462, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B08R58FBXZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 494, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0CRK8YNNY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 496, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B09C8F7J2H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 504, + "sourceId": "17", + "displayId": "17", + "asin": "B0F6TK2KP3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 505, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0BYJHNBWM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 515, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0DJBZXCDP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 516, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0FMRGW63W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 518, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0D175WMJC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 519, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B07FLD65NM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 521, + "sourceId": "24", + "displayId": "24", + "asin": "B0DRFWYNNV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 522, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0DZX3JWQP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 524, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0F5X5G34F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 530, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0BJDL1D9W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 544, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0BYJMMMLX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 545, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B092M4RJVV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 552, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B092M49F1Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 565, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0FMRFHRZR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 566, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0DZWVVM6F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 570, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0BCNZZ32X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 580, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0BRC8PXMW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 581, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B07RL77RM9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 582, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0FMRBN7H4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 584, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0FMRGHCPK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 587, + "sourceId": "10", + "displayId": "10", + "asin": "B0G4BWPCK7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 588, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0CJJ4Y8SB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 589, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0DYY436WG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 591, + "sourceId": "14", + "displayId": "14", + "asin": "B0G64PMQ94", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 592, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0CST698J6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 593, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B00U7LUWR8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 594, + "sourceId": "18", + "displayId": "18", + "asin": "B0DHRJX1VS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 595, + "sourceId": "20", + "displayId": "20", + "asin": "B0CY9NB8VS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 596, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B08ML38H24", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 599, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0BXVBVJ6G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 605, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B08HS69FQG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 608, + "sourceId": "25", + "displayId": "25", + "asin": "B0F281WHDB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 609, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0007RN382", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 610, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0F2JDR3Y5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 612, + "sourceId": "28", + "displayId": "28", + "asin": "B0FX9L2JJ4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 613, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0FD9NVNFT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 615, + "sourceId": "30", + "displayId": "30", + "asin": "B0B72HD5B9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 616, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0F53FQ9Y4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 618, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0GHDHPQ7J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 629, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B07B9ZP8TK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 631, + "sourceId": "6", + "displayId": "6", + "asin": "B0DPWW9P2V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 632, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0CR43DTKJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 659, + "sourceId": "8", + "displayId": "8", + "asin": "B0G8K4C3D6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 660, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0F52TLKVM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 662, + "sourceId": "11", + "displayId": "11", + "asin": "B0BGH6Y6KB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 663, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0D28VG1C3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 667, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0D3LLKF7C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 670, + "sourceId": "14", + "displayId": "14", + "asin": "B09KT2VBJL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 671, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B07F6P6C3F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 672, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0GCZH5V2P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 709, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0FH5RNFZQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 710, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0CSFMDTSR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 714, + "sourceId": "21", + "displayId": "21", + "asin": "B0GR9TS4N8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 715, + "sourceId": "22", + "displayId": "22", + "asin": "B0D9GWVPGJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 716, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0GF2BKHJK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 717, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0GQZ8SPZZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 719, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0D3LQF6P5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 720, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0GF2ML2NY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 722, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0C28BCVH6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 723, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0C1CRZPMS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 730, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0F8HKX897", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 734, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0GSKSC1KR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 735, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0GSQGF76K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 736, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0F9WTNVXP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 738, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0F47S987P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 740, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0F4Y4F5TC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 741, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0DYNW29NB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 748, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0GF29HX77", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 749, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0GM2WBVXF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 751, + "sourceId": "9", + "displayId": "9", + "asin": "B0GGWW658M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 752, + "sourceId": "10", + "displayId": "10", + "asin": "B0F32R7JTF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 753, + "sourceId": "11", + "displayId": "11", + "asin": "B0DZ67TBHQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 754, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0CLC6KSZH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 755, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0F8QW1FS1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 760, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0F6LHFVJ3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 768, + "sourceId": "16", + "displayId": "16", + "asin": "B0DZH72GF6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 769, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B099N1FB4K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 771, + "sourceId": "18", + "displayId": "18", + "asin": "B0BS678GBK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 772, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0F5Y4KSQJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 778, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0D584KC9W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 805, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0GK1D75ZF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 810, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0DPWXNWV5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 812, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0G64ZCGTV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 813, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B07VHK16YV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 815, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0GS3QV5F2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 816, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DC7TR9B5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 821, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FH634932", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 824, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0CY2XN6JF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 826, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0GKR5WMXK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 829, + "sourceId": "30", + "displayId": "30", + "asin": "B0GH4KYZH5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 830, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0FD76KJ9P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 831, + "sourceId": "3", + "displayId": "3", + "asin": "B0836NDGM2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 832, + "sourceId": "4", + "displayId": "4", + "asin": "B0DYJWTS4N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 833, + "sourceId": "5", + "displayId": "5", + "asin": "B089X4VCPY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 834, + "sourceId": "6", + "displayId": "6", + "asin": "B0CQZR1LZX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 835, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0GSVTDQBX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 837, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0D9TK3VMD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 839, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0GDZWHF6D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 841, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0C8N1LZT9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 842, + "sourceId": "12", + "displayId": "12", + "asin": "B0GWHQHKJS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 843, + "sourceId": "13", + "displayId": "13", + "asin": "B0BTTJKZDC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 844, + "sourceId": "14", + "displayId": "14", + "asin": "B0DZPDJ7Q4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 845, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0D5W9F2DS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 849, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0CGCPLWV1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 850, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B09VT58BM4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 852, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B07XZT797H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 854, + "sourceId": "20", + "displayId": "20", + "asin": "B0GW9TR89X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 856, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B09ZKT7QW6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 859, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0CJYRW7RL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 861, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DSZ4V9PJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 862, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B09TKN8F9W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 863, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B09SW82GSP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 871, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B001F4OSJY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 878, + "sourceId": "3", + "displayId": "3", + "asin": "B091BK7ZF3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 879, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B07HSL53DY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 883, + "sourceId": "5", + "displayId": "5", + "asin": "B07HSDTYC8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 884, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0FKN7JZ6B", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 886, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B071XJDSBK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 889, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B006UITUJ8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 890, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0CBPWL6NZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 891, + "sourceId": "11", + "displayId": "11", + "asin": "B0G3Q9B48L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 892, + "sourceId": "12", + "displayId": "12", + "asin": "B0BYJV8P98", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 893, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0G8DTQP1F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 897, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0CYP192B6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 898, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0CCN8TJCD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 903, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0FWKJVMNK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 906, + "sourceId": "19", + "displayId": "19", + "asin": "B0GD11NDH2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 907, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0BC2NFJBP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 911, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0D9RRCC93", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 913, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0DLSZFMM2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 918, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0GFBG4HSR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 919, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B07TBCFGPT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 920, + "sourceId": "27", + "displayId": "27", + "asin": "B0GSZRFZGZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 921, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B008OB1AZ6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 922, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B09XLVPYPR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 930, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0FZK5NCWK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 933, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0DYJTRT6K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 934, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0CL664TZX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 936, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0DN6XQ5W4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 938, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B002HNNWLM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 943, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0F5HHHR65", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 946, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0G5739C1J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 951, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0G11TTQPT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 952, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0G579K29G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 957, + "sourceId": "10", + "displayId": "10", + "asin": "B0G57DKM85", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 958, + "sourceId": "11", + "displayId": "11", + "asin": "B0DGFW14PB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 959, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0DK3YXKS5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 960, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0FGTHRS1R", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 961, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0FP2FDZPZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 963, + "sourceId": "15", + "displayId": "15", + "asin": "B002HO7QQ8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 964, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B002HNS1TU", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 966, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B004KL50HS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 967, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B07QK3B4Q5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 972, + "sourceId": "19", + "displayId": "19", + "asin": "B08DVGHKLL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 973, + "sourceId": "20", + "displayId": "20", + "asin": "B08K3ZYRGC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 974, + "sourceId": "21", + "displayId": "21", + "asin": "B0DZWVCVK1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 975, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0CT29V1D5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 977, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B01N7G9ALO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 978, + "sourceId": "25", + "displayId": "25", + "asin": "B0CQLN3T6N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 979, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FJKTYHSV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 981, + "sourceId": "28", + "displayId": "28", + "asin": "B0FRFNVTKX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 982, + "sourceId": "1", + "displayId": "1", + "asin": "B0DJQWP543", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 983, + "sourceId": "3", + "displayId": "3", + "asin": "B0D7M543CT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 984, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0F21QQQL1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 987, + "sourceId": "5", + "displayId": "5", + "asin": "B0CMZR1JJD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 988, + "sourceId": "6", + "displayId": "6", + "asin": "B0F66NTL6T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 989, + "sourceId": "7", + "displayId": "7", + "asin": "B0D976JCLF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 990, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0FP2DMFMG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 991, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0CTDM36PB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 994, + "sourceId": "10", + "displayId": "10", + "asin": "B0DY76XFLY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 995, + "sourceId": "11", + "displayId": "11", + "asin": "B0CQ4PS256", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 996, + "sourceId": "12_1", + "displayId": "12_1", + "asin": "B0C15RDVDK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 997, + "sourceId": "13", + "displayId": "13", + "asin": "B0F5Y8Y58T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 998, + "sourceId": "14", + "displayId": "14", + "asin": "B0B5CBKC17", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 999, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0FMXVRQM2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1000, + "sourceId": "18", + "displayId": "18", + "asin": "B0DC2WX8Q2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1001, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0FVR6L7NP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1004, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0DFQMCBS7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1006, + "sourceId": "21", + "displayId": "21", + "asin": "B07TSMHP3T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1007, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B09DY2KCLB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1008, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0GRTXKMGZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1010, + "sourceId": "26", + "displayId": "26", + "asin": "B0BG4TTWWW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1011, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FC2QBR9T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1012, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B09Y2H27PS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1013, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B0CTGLQFCD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1016, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B01MCVO50E", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1017, + "sourceId": "3", + "displayId": "3", + "asin": "B0FJXM3T1S", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1018, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0C8MG6NF7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1019, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0C7NK648Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1020, + "sourceId": "6", + "displayId": "6", + "asin": "B0DYFDXD8N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1021, + "sourceId": "7", + "displayId": "7", + "asin": "B0GGMLRZWF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1022, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0D45VVD1Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1024, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0CC6KP279", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1046, + "sourceId": "12", + "displayId": "12", + "asin": "B0FRZYQYGT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1047, + "sourceId": "13", + "displayId": "13", + "asin": "B0DK447HBK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1048, + "sourceId": "14", + "displayId": "14", + "asin": "B0788GRQT1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1049, + "sourceId": "15", + "displayId": "15", + "asin": "B0F93QPPVD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1050, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0BRQG6CKG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1051, + "sourceId": "17", + "displayId": "17", + "asin": "B09DCW6XN1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1052, + "sourceId": "18", + "displayId": "18", + "asin": "B0FSQDHC9V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1053, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0D25DHV1T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1054, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0DJF4Z91G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1056, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0F3J3B1R2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1060, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0F3J6WJZJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1062, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FQTWP8GM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1065, + "sourceId": "28", + "displayId": "28", + "asin": "B0FPQL1ZW9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1066, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0B77PQ12W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1068, + "sourceId": "30", + "displayId": "30", + "asin": "B0FXWTDY16", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1069, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0D6ZV5F22", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1070, + "sourceId": "2", + "displayId": "2", + "asin": "B0BF13CW1W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1071, + "sourceId": "3", + "displayId": "3", + "asin": "B0F52CM3X1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1072, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0043RJSSG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1095, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B07V2G46J7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1096, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B07X4V22PW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1098, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0GQXDVW6C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1099, + "sourceId": "8", + "displayId": "8", + "asin": "B0BK888623", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1100, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0BFWC5SZQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1102, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B0F1C9ZQKD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1106, + "sourceId": "11", + "displayId": "11", + "asin": "B09F5VV8DW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1107, + "sourceId": "12", + "displayId": "12", + "asin": "B0BWMT9LFC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1108, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0FJLQLRNT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1112, + "sourceId": "15", + "displayId": "15", + "asin": "B08ZCNVYTK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1113, + "sourceId": "16", + "displayId": "16", + "asin": "B0CMZLKY9T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1114, + "sourceId": "17", + "displayId": "17", + "asin": "B0GJZXZ2F9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1115, + "sourceId": "18", + "displayId": "18", + "asin": "B07BMFCKCR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1116, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0DK46T977", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1118, + "sourceId": "20", + "displayId": "20", + "asin": "B08HCPX1MB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1119, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0D8L6WRCM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1121, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B09NDN8NV1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1122, + "sourceId": "24", + "displayId": "24", + "asin": "B0GT2527XG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1123, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0FNRCLHNS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1127, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DQS8GKLG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1129, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B003NGLFYI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1132, + "sourceId": "28", + "displayId": "28", + "asin": "B0CR4FTMGG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1133, + "sourceId": "29", + "displayId": "29", + "asin": "B0DK9ZBBKS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1134, + "sourceId": "30", + "displayId": "30", + "asin": "B0D1XX28FN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1135, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B003KHEEY8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1151, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0F9WRKC84", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1153, + "sourceId": "3", + "displayId": "3", + "asin": "B08BHKGYJ7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1154, + "sourceId": "4", + "displayId": "4", + "asin": "B0FT1562DX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1155, + "sourceId": "5", + "displayId": "5", + "asin": "B0F8QRJ9JB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1156, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0070OARSO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1168, + "sourceId": "7", + "displayId": "7", + "asin": "B07XJ4W6SW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1169, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0C1V86KMX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1170, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0CGM1Z2VG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1171, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B004699SWM", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1220, + "sourceId": "11", + "displayId": "11", + "asin": "B0GT281VQK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1221, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B09BCSR7NQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1222, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B003YCKTIE", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1223, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B092CGQN2K", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1224, + "sourceId": "30_1", + "displayId": "30_1", + "asin": "B001WSDMBI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1225, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B079C2CDLD", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1227, + "sourceId": "5", + "displayId": "5", + "asin": "B077WX43MH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1228, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0FQ2YC11V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1229, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0DRFQJ6CX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1231, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0BX65MF93", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1233, + "sourceId": "9", + "displayId": "9", + "asin": "B0CT5ZR247", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1234, + "sourceId": "10", + "displayId": "10", + "asin": "B0BFXLLR2F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1235, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0FDQT4X7W", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1236, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0FQ2XD95Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1238, + "sourceId": "15", + "displayId": "15", + "asin": "B094RDMZ3Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1239, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0DMZHTJY2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1240, + "sourceId": "18", + "displayId": "18", + "asin": "B0CS2TQGM5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1241, + "sourceId": "19", + "displayId": "19", + "asin": "B0DG2XK945", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1242, + "sourceId": "21", + "displayId": "21", + "asin": "B0G2LNGQPK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1243, + "sourceId": "22", + "displayId": "22", + "asin": "B0G4R1RHYH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1244, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0GSRZM4XB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1245, + "sourceId": "25", + "displayId": "25", + "asin": "B0D926NJN9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1246, + "sourceId": "26", + "displayId": "26", + "asin": "B01LZBHEKJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1247, + "sourceId": "27", + "displayId": "27", + "asin": "B09LQL4S9Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1248, + "sourceId": "29_1", + "displayId": "29_1", + "asin": "B0CQTPF6BJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1256, + "sourceId": "30", + "displayId": "30", + "asin": "B0DZVY2F7M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1257, + "sourceId": "1", + "displayId": "1", + "asin": "B0GMYGQ2G6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1258, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0C5WQ6DFB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1261, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0DJVK3SC4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1262, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B000N324DU", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1267, + "sourceId": "6", + "displayId": "6", + "asin": "B074F6YQZW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1268, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B09MD5W6Z5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1269, + "sourceId": "8", + "displayId": "8", + "asin": "B0F94GJX9D", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1270, + "sourceId": "9", + "displayId": "9", + "asin": "B0DP298J3J", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1271, + "sourceId": "10", + "displayId": "10", + "asin": "B010W3V6Z2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1272, + "sourceId": "11_1", + "displayId": "11_1", + "asin": "B0F24BSV4V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1273, + "sourceId": "12", + "displayId": "12", + "asin": "B0B9MKBPH9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1274, + "sourceId": "13", + "displayId": "13", + "asin": "B0BHHKC5JQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1275, + "sourceId": "14", + "displayId": "14", + "asin": "B0B4RFNK72", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1276, + "sourceId": "15", + "displayId": "15", + "asin": "B01LXD3KE6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1277, + "sourceId": "17", + "displayId": "17", + "asin": "B010W3V1W0", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1278, + "sourceId": "18", + "displayId": "18", + "asin": "B095JNPP53", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1279, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0D7DSBNNH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1281, + "sourceId": "21", + "displayId": "21", + "asin": "B0B935PV25", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1282, + "sourceId": "22", + "displayId": "22", + "asin": "B0B67XDHPQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1283, + "sourceId": "24", + "displayId": "24", + "asin": "B072Z1PQM2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1284, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0CT1J5HWX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1285, + "sourceId": "26", + "displayId": "26", + "asin": "B097G2DXSQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1286, + "sourceId": "27", + "displayId": "27", + "asin": "B010W3VLE8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1287, + "sourceId": "28", + "displayId": "28", + "asin": "B00R39MP4A", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1288, + "sourceId": "29", + "displayId": "29", + "asin": "B095JMYSQ9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1289, + "sourceId": "30", + "displayId": "30", + "asin": "B0F8F5H3MG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1290, + "sourceId": "1", + "displayId": "1", + "asin": "B0DNM4R43P", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1291, + "sourceId": "2", + "displayId": "2", + "asin": "B0FCFB3X78", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1292, + "sourceId": "3", + "displayId": "3", + "asin": "B0CN4KXVWF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1293, + "sourceId": "4", + "displayId": "4", + "asin": "B0D455HLWT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1294, + "sourceId": "5", + "displayId": "5", + "asin": "B0B1HYLLYT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1295, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0F1TKQG14", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1296, + "sourceId": "7", + "displayId": "7", + "asin": "B0F32CLT9F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1297, + "sourceId": "8", + "displayId": "8", + "asin": "B0DJXYDPFC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1298, + "sourceId": "9", + "displayId": "9", + "asin": "B0B3RRLNCT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1299, + "sourceId": "10", + "displayId": "10", + "asin": "B0F2DR94NT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1300, + "sourceId": "11", + "displayId": "11", + "asin": "B0BL7HRF5R", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1301, + "sourceId": "12", + "displayId": "12", + "asin": "B0B6PT6D7Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1302, + "sourceId": "13", + "displayId": "13", + "asin": "B0FF4FLHM4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1303, + "sourceId": "14", + "displayId": "14", + "asin": "B07L2476DB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1304, + "sourceId": "15", + "displayId": "15", + "asin": "B0CK4379VH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1305, + "sourceId": "16", + "displayId": "16", + "asin": "B0BRFW6XF4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1306, + "sourceId": "17", + "displayId": "17", + "asin": "B07BZT7699", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1307, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0D8W4JRTY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1308, + "sourceId": "19", + "displayId": "19", + "asin": "B0F9NQMWGC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1309, + "sourceId": "20", + "displayId": "20", + "asin": "B07CF8KD48", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1310, + "sourceId": "21", + "displayId": "21", + "asin": "B0F9NWBVD8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1311, + "sourceId": "22", + "displayId": "22", + "asin": "B0DSZK41Z9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1312, + "sourceId": "23", + "displayId": "23", + "asin": "B0DHP1TPQL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1313, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0DPHSPQRP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1314, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0BVZ3VKNX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1320, + "sourceId": "26", + "displayId": "26", + "asin": "B0FPX7363M", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1321, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0F9KCHB7F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1323, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B07L3H5DDW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1325, + "sourceId": "30", + "displayId": "30", + "asin": "B003K5S4NW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1326, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0BNVHXLDN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1328, + "sourceId": "2", + "displayId": "2", + "asin": "B0FC2R299V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1329, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0BNVJPSDT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1330, + "sourceId": "5", + "displayId": "5", + "asin": "B0CCRNRHYW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1331, + "sourceId": "6_1", + "displayId": "6_1", + "asin": "B0FP2NQM67", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1334, + "sourceId": "7", + "displayId": "7", + "asin": "B0DRSD66T3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1335, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0DM6CS4KG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1336, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0GQ2YGFTR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1338, + "sourceId": "10", + "displayId": "10", + "asin": "B0F1LNXRSH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1339, + "sourceId": "11", + "displayId": "11", + "asin": "B0GJ59NQTT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1340, + "sourceId": "12", + "displayId": "12", + "asin": "B0GKY1T54N", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1341, + "sourceId": "13", + "displayId": "13", + "asin": "B0FZNMHLDY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1342, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0DHWYL3JP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1344, + "sourceId": "16_1", + "displayId": "16_1", + "asin": "B0CW5DD6SC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1351, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B0CRH7T5WG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1353, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0CRR6F9JX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1354, + "sourceId": "20", + "displayId": "20", + "asin": "B09D3XG1PT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1355, + "sourceId": "22", + "displayId": "22", + "asin": "B00AFGCL42", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1356, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0CXP3619X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1357, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0CW5GFQX3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1363, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0CZDK561H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1364, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FKLRMG14", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1373, + "sourceId": "28_1", + "displayId": "28_1", + "asin": "B0DFQWC297", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1383, + "sourceId": "1_1", + "displayId": "1_1", + "asin": "B0DGPV9QY8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1386, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B0GV3W42MJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1388, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0DK4JV5YY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1402, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0CV4K3HSW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1403, + "sourceId": "9", + "displayId": "9", + "asin": "B0FN5YD344", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1404, + "sourceId": "10", + "displayId": "10", + "asin": "B01HY4XZE2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1407, + "sourceId": "13", + "displayId": "13", + "asin": "B0D485JG3T", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1408, + "sourceId": "15", + "displayId": "15", + "asin": "B0GC584NTL", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1409, + "sourceId": "16", + "displayId": "16", + "asin": "B0FDQLKJL3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1410, + "sourceId": "18_1", + "displayId": "18_1", + "asin": "B0D6RBQR4Q", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1418, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B0CSLMZ4XS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1419, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0FC64KYP9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1421, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0FH234TL6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1445, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0F6D4Z3WB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1455, + "sourceId": "23_1", + "displayId": "23_1", + "asin": "B0F8RCZ91V", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1465, + "sourceId": "24_1", + "displayId": "24_1", + "asin": "B0FP5Q7B7X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1476, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0FM88JBRX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1477, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0CKMT72MX", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1486, + "sourceId": "27", + "displayId": "27", + "asin": "B0C4JT7PHB", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1487, + "sourceId": "28", + "displayId": "28", + "asin": "B0C1RMVGTZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1488, + "sourceId": "29", + "displayId": "29", + "asin": "B07BFQJ3G5", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1489, + "sourceId": "30", + "displayId": "30", + "asin": "B074VGHYF8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1490, + "sourceId": "1", + "displayId": "1", + "asin": "B015AK9JXI", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1491, + "sourceId": "2_1", + "displayId": "2_1", + "asin": "B084WSGN9C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1492, + "sourceId": "3_1", + "displayId": "3_1", + "asin": "B0FHWJ42Q8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1497, + "sourceId": "4_1", + "displayId": "4_1", + "asin": "B0CZDTGFSQ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1498, + "sourceId": "5_1", + "displayId": "5_1", + "asin": "B0F7XKNY9L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1499, + "sourceId": "6", + "displayId": "6", + "asin": "B0DWLFKPNW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1500, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0CWDPSJG4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1512, + "sourceId": "8_1", + "displayId": "8_1", + "asin": "B0G488Z8JG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1514, + "sourceId": "9_1", + "displayId": "9_1", + "asin": "B0BYRQ5TBY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1515, + "sourceId": "10", + "displayId": "10", + "asin": "B0CWH1MRCV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1516, + "sourceId": "11", + "displayId": "11", + "asin": "B0FSCXLBHZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1517, + "sourceId": "12", + "displayId": "12", + "asin": "B0GH6YJX2L", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1518, + "sourceId": "13_1", + "displayId": "13_1", + "asin": "B0GMQ29YQ9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1519, + "sourceId": "14_1", + "displayId": "14_1", + "asin": "B0BQLX4QP3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1521, + "sourceId": "15", + "displayId": "15", + "asin": "B0FXVHQNQ4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1522, + "sourceId": "16", + "displayId": "16", + "asin": "B072DVNZYH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1523, + "sourceId": "17_1", + "displayId": "17_1", + "asin": "B0G198MZH3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1524, + "sourceId": "18", + "displayId": "18", + "asin": "B0F7HGQHLP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1525, + "sourceId": "19", + "displayId": "19", + "asin": "B0B9M83MZV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1526, + "sourceId": "20", + "displayId": "20", + "asin": "B074P9YRGW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1527, + "sourceId": "21_1", + "displayId": "21_1", + "asin": "B0G3YJ32Q4", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1528, + "sourceId": "22", + "displayId": "22", + "asin": "B0D8RXPCH6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1529, + "sourceId": "24", + "displayId": "24", + "asin": "B0CBPKKT98", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1530, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0DGG82L25", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1531, + "sourceId": "26", + "displayId": "26", + "asin": "B0FXVNDFHC", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1532, + "sourceId": "27", + "displayId": "27", + "asin": "B0CYY2YJ2S", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1533, + "sourceId": "28", + "displayId": "28", + "asin": "B0FC34Z9P6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1534, + "sourceId": "29", + "displayId": "29", + "asin": "B0018MQIVO", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1535, + "sourceId": "30", + "displayId": "30", + "asin": "B018OQ66AE", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1536, + "sourceId": "1", + "displayId": "1", + "asin": "B0FNMK6R7Z", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1537, + "sourceId": "3", + "displayId": "3", + "asin": "B0CTJ8WRWZ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1538, + "sourceId": "4", + "displayId": "4", + "asin": "B0CTJ9522Y", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1539, + "sourceId": "5", + "displayId": "5", + "asin": "B0CTJ88CKR", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1540, + "sourceId": "6", + "displayId": "6", + "asin": "B07DL3PBL7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1541, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B0C96V7HFN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1543, + "sourceId": "8", + "displayId": "8", + "asin": "B079HQKBP3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1544, + "sourceId": "9", + "displayId": "9", + "asin": "B0BZHW8VQ6", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1545, + "sourceId": "10_1", + "displayId": "10_1", + "asin": "B019RKRGWS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1547, + "sourceId": "11", + "displayId": "11", + "asin": "B0DCLSFGQS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1548, + "sourceId": "12", + "displayId": "12", + "asin": "B07FL8Y4BP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1549, + "sourceId": "14", + "displayId": "14", + "asin": "B01NBVCL86", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1550, + "sourceId": "15_1", + "displayId": "15_1", + "asin": "B0C8J5Z7VN", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1551, + "sourceId": "16", + "displayId": "16", + "asin": "B0CP73M8ST", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1552, + "sourceId": "18", + "displayId": "18", + "asin": "B0G2XVTF2R", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1553, + "sourceId": "19_1", + "displayId": "19_1", + "asin": "B08GCVHM9S", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1555, + "sourceId": "20_1", + "displayId": "20_1", + "asin": "B0B5X3YGMP", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1557, + "sourceId": "22", + "displayId": "22", + "asin": "B07VM7QS8C", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1558, + "sourceId": "23", + "displayId": "23", + "asin": "B0F93G7KFF", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1559, + "sourceId": "24", + "displayId": "24", + "asin": "B098B8QTM1", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1560, + "sourceId": "25_1", + "displayId": "25_1", + "asin": "B0F4WSK73F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1561, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DC5M4XT7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1564, + "sourceId": "27", + "displayId": "27", + "asin": "B07SD5DWFT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1565, + "sourceId": "28", + "displayId": "28", + "asin": "B082ZNZG3X", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1566, + "sourceId": "29", + "displayId": "29", + "asin": "B084M4ZGC3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1567, + "sourceId": "30", + "displayId": "30", + "asin": "B0FXH7SVWV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1568, + "sourceId": "3", + "displayId": "3", + "asin": "B07RM4MB3H", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1569, + "sourceId": "4", + "displayId": "4", + "asin": "B0154H395G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1570, + "sourceId": "5", + "displayId": "5", + "asin": "B08CHFDRJT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1571, + "sourceId": "6", + "displayId": "6", + "asin": "B09YQ3D7CW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1572, + "sourceId": "7_1", + "displayId": "7_1", + "asin": "B087YTMRK8", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1574, + "sourceId": "8", + "displayId": "8", + "asin": "B08WKDDV96", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1575, + "sourceId": "9", + "displayId": "9", + "asin": "B0GFMG4SFT", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1576, + "sourceId": "10", + "displayId": "10", + "asin": "B07KWY3XLW", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1577, + "sourceId": "11", + "displayId": "11", + "asin": "B07RQTKPSK", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1578, + "sourceId": "12", + "displayId": "12", + "asin": "B0CRHC42M2", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1579, + "sourceId": "14", + "displayId": "14", + "asin": "B07RGG2TCV", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1580, + "sourceId": "15", + "displayId": "15", + "asin": "B0CTJNQ5MH", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1581, + "sourceId": "16", + "displayId": "16", + "asin": "B0GGZSVY7G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1582, + "sourceId": "17", + "displayId": "17", + "asin": "B0G3WTPGMG", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1583, + "sourceId": "18", + "displayId": "18", + "asin": "B0GH136M59", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1584, + "sourceId": "19", + "displayId": "19", + "asin": "B0G3WJP9HJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1585, + "sourceId": "20", + "displayId": "20", + "asin": "B0814RZNHY", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1586, + "sourceId": "21", + "displayId": "21", + "asin": "B09ZXZH432", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1587, + "sourceId": "22_1", + "displayId": "22_1", + "asin": "B0BWY99XXS", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1589, + "sourceId": "23", + "displayId": "23", + "asin": "B0849Y6VYJ", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1590, + "sourceId": "24", + "displayId": "24", + "asin": "B0FKBBNN2G", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1591, + "sourceId": "25", + "displayId": "25", + "asin": "B07SBWB2X9", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1592, + "sourceId": "26_1", + "displayId": "26_1", + "asin": "B0DK4JNBM3", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1593, + "sourceId": "27_1", + "displayId": "27_1", + "asin": "B0FFZ3636F", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1594, + "sourceId": "29", + "displayId": "29", + "asin": "B0BRGZKXN7", + "country": "英国", + "url": "", + "title": "" + }, + { + "rowIndex": 1602, + "sourceId": "2", + "displayId": "2", + "asin": "B0GSTM85H3", + "country": "英国", + "url": "", + "title": "" + } + ] + }, + "code": None +} + spide.process_task(task_data) \ No newline at end of file diff --git a/app/amazon/main.py b/app/amazon/main.py index 36136d7..1b8a035 100644 --- a/app/amazon/main.py +++ b/app/amazon/main.py @@ -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实例并处理任务 diff --git a/app/amazon/match_action.py b/app/amazon/match_action.py index 596e22b..7745f20 100644 --- a/app/amazon/match_action.py +++ b/app/amazon/match_action.py @@ -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) diff --git a/app/amazon/price_match.py b/app/amazon/price_match.py index cb038da..ebdaa18 100644 --- a/app/amazon/price_match.py +++ b/app/amazon/price_match.py @@ -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 + ) \ No newline at end of file diff --git a/app/assets/convert.js b/app/assets/convert.js index a140d73..a07e006 100644 --- a/app/assets/convert.js +++ b/app/assets/convert.js @@ -1 +1 @@ -import{d as A,o as H,a as n,c as o,b as z,B as K,e as s,F as w,r as F,t as r,f as _,n as E,w as M,s as j,u as q,g as u,h as T,x as J,i as k,E as i,y as L,z as O,A as G,_ as Q,p as W,q as X}from"./pywebview-CeWJDVeG.js";import{e as Y}from"./brand-UU-ckLq6.js";const Z={class:"page-shell module-page"},ee={class:"main-content"},se={class:"left-panel"},te={class:"upload-zone"},ae={class:"selected-files clean-placeholder"},le={key:0,class:"more-line"},ne={key:1},oe={class:"option-group"},ie=["value"],re={class:"template-item-content"},ce={class:"label"},ue={key:0,class:"template-tag"},de={key:1,class:"template-tag muted"},ve={key:2,class:"template-tag custom"},pe={class:"desc"},_e={key:0,class:"empty-option"},fe={class:"option-group"},me={class:"radio-item active"},he={class:"desc"},ye={class:"run-row"},ge=["disabled"],be={class:"loading-msg"},we={class:"right-panel"},ke={class:"task-list-wrap"},Ce={class:"clean-result-summary"},xe={class:"summary-card"},Fe={class:"summary-card"},Pe={class:"summary-card"},Ee={class:"result-list-wrap"},Te={key:0,class:"empty-tasks"},Ie={key:1,class:"task-list clean-result-list"},Be={class:"left"},Ne=["title"],$e={key:0,class:"files"},De={key:1,class:"files"},Re={class:"task-right"},Se=["onClick"],Ue=["onClick"],Ve=A({__name:"BrandConvertTab",setup(He){const v=u([]),g=u(""),f=u([]),m=u(!1),b=u([]),h=u({total:0,successCount:0,failedCount:0,items:[]}),d=u([]),c=u(""),C=T(()=>v.value.slice(0,8)),I=T(()=>d.value.find(a=>a.id===c.value)||null);async function P(a){const e=k();if(!e?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const l of a){const p=typeof l=="string"?l:l.absolutePath,V=typeof l=="string"?void 0:l.relativePath,y=await e.upload_file_to_java(p,V);if(!y?.success||!y.data)throw new Error(y?.error||y?.message||`上传失败:${p}`);t.push(y.data)}return t}async function B(a){const e=await J();d.value=e||[];const t=d.value.find(p=>p.id===c.value);if(t){c.value=t.id;return}const l=d.value.find(p=>p.isDefault);if(l){c.value=l.id;return}c.value=d.value[0]?.id||""}async function N(a,e){v.value=a,g.value="",f.value=await P(a),i.success(e)}async function $(){const a=k();if(!a?.select_brand_xlsx_files){i.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const e=await a.select_brand_xlsx_files();if(!e?.length)return;await N(e,`已选择 ${e.length} 个待转换文件`)}catch(e){i.error(e instanceof Error?e.message:"选择失败")}}async function D(){const a=k();if(!a?.select_brand_folder){i.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const e=await a.select_brand_folder();if(!e)return;g.value=e.split(/[/\\]/).filter(Boolean).pop()||"";const t=await Y(e);if(t.success&&t.items?.length){v.value=t.items.map(l=>l.relativePath),f.value=await P(t.items),i.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`);return}i.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(e){i.error(e instanceof Error?e.message:"选择失败")}}async function R(){if(!f.value.length){i.warning("请先选择待转换 Excel 文件或文件夹");return}if(!c.value){i.warning("请先选择模板");return}try{m.value=!0;const a=await L({files:f.value.map(e=>({fileKey:e.fileKey,originalFilename:e.originalFilename,relativePath:e.relativePath})),templateId:c.value,archiveName:f.value.some(e=>!!e.relativePath)&&g.value?g.value:void 0});h.value=a,b.value=a.items||[],await x(),i.success("格式转换完成")}catch(a){i.error(a instanceof Error?a.message:"格式转换失败")}finally{m.value=!1}}async function x(){try{const a=await O();b.value=a.items||[],h.value={total:a.items?.length||0,successCount:a.items?.filter(e=>e.success).length||0,failedCount:a.items?.filter(e=>!e.success).length||0,items:a.items||[]}}catch{}}async function S(a){try{await G(a),await x(),i.success("已删除")}catch(e){i.error(e instanceof Error?e.message:"删除失败")}}async function U(a){const e=k();if(!a.downloadUrl){i.warning("当前结果没有下载地址");return}const t=a.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}.txt`;if(e?.save_file_from_url_new){const l=await e.save_file_from_url_new(a.downloadUrl,t);l.success?i.success(`已保存:${l.path||t}`):l.error&&l.error!=="用户取消"&&i.error(l.error);return}}return H(()=>{B().catch(()=>{}),x().catch(()=>{})}),(a,e)=>(n(),o("div",Z,[z(K,{active:"convert"}),s("div",ee,[s("aside",se,[e[5]||(e[5]=s("div",{class:"section-title"},"选择文件",-1)),s("div",te,[e[1]||(e[1]=s("div",{class:"hint"},"选择需要转换的 Excel 文件或文件夹,将按所选模板生成 txt 文件。",-1)),s("div",{class:"btns"},[s("button",{type:"button",class:"opt-btn",onClick:$},"选择 Excel 文件"),s("button",{type:"button",class:"opt-btn",onClick:D},"选择文件夹")]),s("div",ae,[v.value.length?(n(),o(w,{key:0},[(n(!0),o(w,null,F(C.value,t=>(n(),o("span",{key:t},r(t),1))),128)),v.value.length>C.value.length?(n(),o("span",le," 还有 "+r(v.value.length-C.value.length)+" 个文件未展开显示 ",1)):_("",!0)],64)):(n(),o("span",ne,"暂未选择待转换文件"))])]),e[6]||(e[6]=s("div",{class:"section-title"},"模板选择",-1)),s("div",oe,[(n(!0),o(w,null,F(d.value,t=>(n(),o("label",{key:t.id,class:E(["radio-item",{active:c.value===t.id}])},[M(s("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>c.value=l),type:"radio",value:t.id,name:"convert-template"},null,8,ie),[[j,c.value]]),s("div",re,[s("div",null,[s("span",ce,[q(r(t.templateName)+" ",1),t.isDefault?(n(),o("span",ue,"默认")):t.builtIn?(n(),o("span",de,"内置")):(n(),o("span",ve,"自定义"))]),s("div",pe,"输出文件:"+r(t.outputFilename),1)])])],2))),128)),d.value.length?_("",!0):(n(),o("div",_e,"暂无可用模板"))]),e[7]||(e[7]=s("div",{class:"section-title"},"转换说明",-1)),s("div",fe,[s("label",me,[e[3]||(e[3]=s("input",{type:"checkbox",checked:"",disabled:""},null,-1)),s("div",null,[e[2]||(e[2]=s("span",{class:"label"},"按当前模板输出",-1)),s("div",he,"当前模板:"+r(I.value?.templateName||"未加载模板"),1)])]),e[4]||(e[4]=s("label",{class:"radio-item active"},[s("input",{type:"checkbox",checked:"",disabled:""}),s("div",null,[s("span",{class:"label"},"SKU 使用雪花ID-序号"),s("div",{class:"desc"},"例如 1773816146796-1")])],-1))]),s("div",ye,[s("button",{type:"button",class:"btn-run",disabled:m.value,onClick:R},r(m.value?"转换中...":"开始转换"),9,ge),s("span",be,r(m.value?"正在生成并上传结果,请稍候…":"选择文件后即可执行格式转换,结果会显示在右侧供下载"),1)])]),s("section",we,[e[12]||(e[12]=s("div",{class:"panel-header"},"转换结果",-1)),s("div",ke,[s("div",Ce,[s("div",xe,[e[8]||(e[8]=s("span",{class:"summary-label"},"已处理文件",-1)),s("strong",null,r(h.value.total),1)]),s("div",Fe,[e[9]||(e[9]=s("span",{class:"summary-label"},"成功结果",-1)),s("strong",null,r(h.value.successCount),1)]),s("div",Pe,[e[10]||(e[10]=s("span",{class:"summary-label"},"失败文件",-1)),s("strong",null,r(h.value.failedCount),1)])]),s("div",Ee,[e[11]||(e[11]=s("div",{class:"result-list-header"},[s("span",null,"生成的结果压缩包列表")],-1)),b.value.length===0?(n(),o("div",Te," 暂无转换结果,完成格式转换后会在这里展示结果压缩包 ")):(n(),o("ul",Ie,[(n(!0),o(w,null,F(b.value,t=>(n(),o("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}`,class:"task-item"},[s("div",Be,[s("span",{class:"id",title:t.sourceFilename},r(t.sourceFilename||"-"),9,Ne),t.outputFilename?(n(),o("div",$e,"压缩包文件:"+r(t.outputFilename),1)):_("",!0),t.error?(n(),o("div",De,"错误信息:"+r(t.error),1)):_("",!0)]),s("div",Re,[s("span",{class:E(["status",t.success?"success":"failed"])},r(t.success?"已完成":"失败"),3),t.success&&t.downloadUrl?(n(),o("button",{key:0,type:"button",class:"download",onClick:l=>U(t)}," 下载压缩包 ",8,Se)):_("",!0),t.resultId?(n(),o("button",{key:1,type:"button",class:"btn-delete",onClick:l=>S(t.resultId)}," 删除 ",8,Ue)):_("",!0)])]))),128))]))])])])])]))}}),Ae=Q(Ve,[["__scopeId","data-v-7c280b44"]]);W(Ae).use(X).mount("#app"); +import{d as A,o as H,a as n,c as o,b as z,B as K,e as s,F as w,r as F,t as r,f as _,n as E,w as M,s as j,u as q,g as u,h as T,x as J,i as k,E as i,y as L,z as O,A as G,_ as Q,p as W,q as X}from"./pywebview-Bt854mYs.js";import{e as Y}from"./brand-5-W0Wonr.js";const Z={class:"page-shell module-page"},ee={class:"main-content"},se={class:"left-panel"},te={class:"upload-zone"},ae={class:"selected-files clean-placeholder"},le={key:0,class:"more-line"},ne={key:1},oe={class:"option-group"},ie=["value"],re={class:"template-item-content"},ce={class:"label"},ue={key:0,class:"template-tag"},de={key:1,class:"template-tag muted"},ve={key:2,class:"template-tag custom"},pe={class:"desc"},_e={key:0,class:"empty-option"},fe={class:"option-group"},me={class:"radio-item active"},he={class:"desc"},ye={class:"run-row"},ge=["disabled"],be={class:"loading-msg"},we={class:"right-panel"},ke={class:"task-list-wrap"},Ce={class:"clean-result-summary"},xe={class:"summary-card"},Fe={class:"summary-card"},Pe={class:"summary-card"},Ee={class:"result-list-wrap"},Te={key:0,class:"empty-tasks"},Ie={key:1,class:"task-list clean-result-list"},Be={class:"left"},Ne=["title"],$e={key:0,class:"files"},De={key:1,class:"files"},Re={class:"task-right"},Se=["onClick"],Ue=["onClick"],Ve=A({__name:"BrandConvertTab",setup(He){const v=u([]),g=u(""),f=u([]),m=u(!1),b=u([]),h=u({total:0,successCount:0,failedCount:0,items:[]}),d=u([]),c=u(""),C=T(()=>v.value.slice(0,8)),I=T(()=>d.value.find(a=>a.id===c.value)||null);async function P(a){const e=k();if(!e?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const l of a){const p=typeof l=="string"?l:l.absolutePath,V=typeof l=="string"?void 0:l.relativePath,y=await e.upload_file_to_java(p,V);if(!y?.success||!y.data)throw new Error(y?.error||y?.message||`上传失败:${p}`);t.push(y.data)}return t}async function B(a){const e=await J();d.value=e||[];const t=d.value.find(p=>p.id===c.value);if(t){c.value=t.id;return}const l=d.value.find(p=>p.isDefault);if(l){c.value=l.id;return}c.value=d.value[0]?.id||""}async function N(a,e){v.value=a,g.value="",f.value=await P(a),i.success(e)}async function $(){const a=k();if(!a?.select_brand_xlsx_files){i.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const e=await a.select_brand_xlsx_files();if(!e?.length)return;await N(e,`已选择 ${e.length} 个待转换文件`)}catch(e){i.error(e instanceof Error?e.message:"选择失败")}}async function D(){const a=k();if(!a?.select_brand_folder){i.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const e=await a.select_brand_folder();if(!e)return;g.value=e.split(/[/\\]/).filter(Boolean).pop()||"";const t=await Y(e);if(t.success&&t.items?.length){v.value=t.items.map(l=>l.relativePath),f.value=await P(t.items),i.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`);return}i.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(e){i.error(e instanceof Error?e.message:"选择失败")}}async function R(){if(!f.value.length){i.warning("请先选择待转换 Excel 文件或文件夹");return}if(!c.value){i.warning("请先选择模板");return}try{m.value=!0;const a=await L({files:f.value.map(e=>({fileKey:e.fileKey,originalFilename:e.originalFilename,relativePath:e.relativePath})),templateId:c.value,archiveName:f.value.some(e=>!!e.relativePath)&&g.value?g.value:void 0});h.value=a,b.value=a.items||[],await x(),i.success("格式转换完成")}catch(a){i.error(a instanceof Error?a.message:"格式转换失败")}finally{m.value=!1}}async function x(){try{const a=await O();b.value=a.items||[],h.value={total:a.items?.length||0,successCount:a.items?.filter(e=>e.success).length||0,failedCount:a.items?.filter(e=>!e.success).length||0,items:a.items||[]}}catch{}}async function S(a){try{await G(a),await x(),i.success("已删除")}catch(e){i.error(e instanceof Error?e.message:"删除失败")}}async function U(a){const e=k();if(!a.downloadUrl){i.warning("当前结果没有下载地址");return}const t=a.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}.txt`;if(e?.save_file_from_url_new){const l=await e.save_file_from_url_new(a.downloadUrl,t);l.success?i.success(`已保存:${l.path||t}`):l.error&&l.error!=="用户取消"&&i.error(l.error);return}}return H(()=>{B().catch(()=>{}),x().catch(()=>{})}),(a,e)=>(n(),o("div",Z,[z(K,{active:"convert"}),s("div",ee,[s("aside",se,[e[5]||(e[5]=s("div",{class:"section-title"},"选择文件",-1)),s("div",te,[e[1]||(e[1]=s("div",{class:"hint"},"选择需要转换的 Excel 文件或文件夹,将按所选模板生成 txt 文件。",-1)),s("div",{class:"btns"},[s("button",{type:"button",class:"opt-btn",onClick:$},"选择 Excel 文件"),s("button",{type:"button",class:"opt-btn",onClick:D},"选择文件夹")]),s("div",ae,[v.value.length?(n(),o(w,{key:0},[(n(!0),o(w,null,F(C.value,t=>(n(),o("span",{key:t},r(t),1))),128)),v.value.length>C.value.length?(n(),o("span",le," 还有 "+r(v.value.length-C.value.length)+" 个文件未展开显示 ",1)):_("",!0)],64)):(n(),o("span",ne,"暂未选择待转换文件"))])]),e[6]||(e[6]=s("div",{class:"section-title"},"模板选择",-1)),s("div",oe,[(n(!0),o(w,null,F(d.value,t=>(n(),o("label",{key:t.id,class:E(["radio-item",{active:c.value===t.id}])},[M(s("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>c.value=l),type:"radio",value:t.id,name:"convert-template"},null,8,ie),[[j,c.value]]),s("div",re,[s("div",null,[s("span",ce,[q(r(t.templateName)+" ",1),t.isDefault?(n(),o("span",ue,"默认")):t.builtIn?(n(),o("span",de,"内置")):(n(),o("span",ve,"自定义"))]),s("div",pe,"输出文件:"+r(t.outputFilename),1)])])],2))),128)),d.value.length?_("",!0):(n(),o("div",_e,"暂无可用模板"))]),e[7]||(e[7]=s("div",{class:"section-title"},"转换说明",-1)),s("div",fe,[s("label",me,[e[3]||(e[3]=s("input",{type:"checkbox",checked:"",disabled:""},null,-1)),s("div",null,[e[2]||(e[2]=s("span",{class:"label"},"按当前模板输出",-1)),s("div",he,"当前模板:"+r(I.value?.templateName||"未加载模板"),1)])]),e[4]||(e[4]=s("label",{class:"radio-item active"},[s("input",{type:"checkbox",checked:"",disabled:""}),s("div",null,[s("span",{class:"label"},"SKU 使用雪花ID-序号"),s("div",{class:"desc"},"例如 1773816146796-1")])],-1))]),s("div",ye,[s("button",{type:"button",class:"btn-run",disabled:m.value,onClick:R},r(m.value?"转换中...":"开始转换"),9,ge),s("span",be,r(m.value?"正在生成并上传结果,请稍候…":"选择文件后即可执行格式转换,结果会显示在右侧供下载"),1)])]),s("section",we,[e[12]||(e[12]=s("div",{class:"panel-header"},"转换结果",-1)),s("div",ke,[s("div",Ce,[s("div",xe,[e[8]||(e[8]=s("span",{class:"summary-label"},"已处理文件",-1)),s("strong",null,r(h.value.total),1)]),s("div",Fe,[e[9]||(e[9]=s("span",{class:"summary-label"},"成功结果",-1)),s("strong",null,r(h.value.successCount),1)]),s("div",Pe,[e[10]||(e[10]=s("span",{class:"summary-label"},"失败文件",-1)),s("strong",null,r(h.value.failedCount),1)])]),s("div",Ee,[e[11]||(e[11]=s("div",{class:"result-list-header"},[s("span",null,"生成的结果压缩包列表")],-1)),b.value.length===0?(n(),o("div",Te," 暂无转换结果,完成格式转换后会在这里展示结果压缩包 ")):(n(),o("ul",Ie,[(n(!0),o(w,null,F(b.value,t=>(n(),o("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}`,class:"task-item"},[s("div",Be,[s("span",{class:"id",title:t.sourceFilename},r(t.sourceFilename||"-"),9,Ne),t.outputFilename?(n(),o("div",$e,"压缩包文件:"+r(t.outputFilename),1)):_("",!0),t.error?(n(),o("div",De,"错误信息:"+r(t.error),1)):_("",!0)]),s("div",Re,[s("span",{class:E(["status",t.success?"success":"failed"])},r(t.success?"已完成":"失败"),3),t.success&&t.downloadUrl?(n(),o("button",{key:0,type:"button",class:"download",onClick:l=>U(t)}," 下载压缩包 ",8,Se)):_("",!0),t.resultId?(n(),o("button",{key:1,type:"button",class:"btn-delete",onClick:l=>S(t.resultId)}," 删除 ",8,Ue)):_("",!0)])]))),128))]))])])])])]))}}),Ae=Q(Ve,[["__scopeId","data-v-7c280b44"]]);W(Ae).use(X).mount("#app"); diff --git a/app/assets/dedupe.js b/app/assets/dedupe.js index 6ba331f..021e2a7 100644 --- a/app/assets/dedupe.js +++ b/app/assets/dedupe.js @@ -1 +1 @@ -import{d as z,o as W,a as n,c as o,b as q,B as J,e as s,F as C,r as F,t as i,f as b,n as I,w as P,v as B,g as u,h as L,i as x,E as r,j as O,k as G,l as Q,m as X,_ as Y,p as Z,q as ee}from"./pywebview-CeWJDVeG.js";import{e as se}from"./brand-UU-ckLq6.js";const te={class:"page-shell module-page"},le={class:"main-content"},ae={class:"left-panel"},ne={class:"upload-zone"},oe={class:"selected-files clean-placeholder"},re={key:0,class:"more-line"},ie={key:1},ue={class:"option-group column-option-group"},ce={class:"column-toolbar"},de={class:"column-count"},ve={key:0,class:"column-grid"},pe=["value"],fe={key:1,class:"empty-column-state"},_e={class:"option-group"},me={class:"run-row"},he=["disabled"],ge={class:"loading-msg"},ye={class:"right-panel"},be={class:"task-list-wrap"},we={class:"clean-result-summary"},ke={class:"summary-card"},Ce={class:"summary-card"},Ie={class:"summary-card"},xe={class:"result-list-wrap"},Ee={key:0,class:"empty-tasks"},De={key:1,class:"task-list clean-result-list"},Fe={class:"left"},Pe=["title"],Be={key:0,class:"files"},Se={key:1,class:"files"},Ue={class:"task-right"},Ne=["onClick"],$e=["onClick"],Ae=z({__name:"BrandDedupeTab",setup(Ke){const p=u([]),c=u([]),f=u([]),w=u(""),d=u([]),S=u(!1),_=u(!0),m=u(!0),h=u(!1),k=u([]),g=u({total:0,successCount:0,failedCount:0,items:[]}),E=L(()=>f.value.slice(0,8));function $(){c.value=[...p.value]}function A(){c.value=[]}async function U(l){const e=x();if(!e?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const a of l){const v=typeof a=="string"?a:a.absolutePath,j=typeof a=="string"?void 0:a.relativePath,y=await e.upload_file_to_java(v,j);if(!y?.success||!y.data)throw new Error(y?.error||y?.message||`上传失败:${v}`);t.push(y.data)}return t}async function N(l){const e=await X(l);if(!e.headers?.length){r.error("读取 Excel 表头失败"),p.value=[],c.value=[];return}const t=["id","ASIN","国家","价格","卖家名称"],a=[...t.filter(v=>e.headers?.includes(v)),...(e.headers||[]).filter(v=>!t.includes(v))];p.value=a,c.value=t.filter(v=>a.includes(v))}async function H(l,e){f.value=l,w.value="",d.value=await U(l),d.value.length>0&&await N(d.value[0].fileKey),r.success(e)}async function K(){const l=x();if(!l?.select_brand_xlsx_files){r.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const e=await l.select_brand_xlsx_files();if(!e?.length)return;await H(e,`已选择 ${e.length} 个待清洗文件`)}catch(e){r.error(e instanceof Error?e.message:"选择失败")}}async function R(){const l=x();if(!l?.select_brand_folder){r.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const e=await l.select_brand_folder();if(!e)return;w.value=e.split(/[/\\]/).filter(Boolean).pop()||"";const t=await se(e);if(t.success&&t.items?.length){f.value=t.items.map(a=>a.relativePath),d.value=await U(t.items),d.value.length>0&&await N(d.value[0].fileKey),r.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`);return}r.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(e){r.error(e instanceof Error?e.message:"选择失败")}}async function V(){if(!d.value.length){r.warning("请先选择待清洗 Excel 文件或文件夹");return}if(!c.value.length){r.warning("请至少选择一列保留列");return}if(!S.value&&!_.value&&!m.value){r.warning("请至少选择一种 ID 保留规则");return}try{h.value=!0;const l=await O({files:d.value.map(e=>({fileKey:e.fileKey,originalFilename:e.originalFilename,relativePath:e.relativePath})),selectedColumns:c.value,keepIntegerIds:S.value,keepUnderscoreIds:_.value,keepIntegerMainIdsWhenNoSubIds:m.value,archiveName:d.value.some(e=>!!e.relativePath)&&w.value?w.value:void 0});g.value=l,k.value=l.items||[],await D(),r.success("数据去重完成")}catch(l){r.error(l instanceof Error?l.message:"去重失败")}finally{h.value=!1}}async function D(){try{const l=await G();k.value=l.items||[],g.value={total:l.items?.length||0,successCount:l.items?.filter(e=>e.success).length||0,failedCount:l.items?.filter(e=>!e.success).length||0,items:l.items||[]}}catch{}}async function M(l){try{await Q(l),await D(),r.success("已删除")}catch(e){r.error(e instanceof Error?e.message:"删除失败")}}async function T(l){const e=x();if(!l.downloadUrl){r.warning("当前结果没有下载地址");return}const t=l.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}_cleaned.xlsx`;if(e?.save_file_from_url_new){const a=await e.save_file_from_url_new(l.downloadUrl,t);a.success?r.success(`已保存:${a.path||t}`):a.error&&a.error!=="用户取消"&&r.error(a.error);return}}return W(()=>{D().catch(()=>{})}),(l,e)=>(n(),o("div",te,[q(J,{active:"dedupe"}),s("div",le,[s("aside",ae,[e[7]||(e[7]=s("div",{class:"section-title"},"选择文件",-1)),s("div",ne,[e[3]||(e[3]=s("div",{class:"hint"},"选择需要清洗的 Excel 文件或文件夹,后续将按所选规则输出处理结果。",-1)),s("div",{class:"btns"},[s("button",{type:"button",class:"opt-btn",onClick:K},"选择 Excel 文件"),s("button",{type:"button",class:"opt-btn",onClick:R},"选择文件夹")]),s("div",oe,[f.value.length?(n(),o(C,{key:0},[(n(!0),o(C,null,F(E.value,t=>(n(),o("span",{key:t},i(t),1))),128)),f.value.length>E.value.length?(n(),o("span",re," 还有 "+i(f.value.length-E.value.length)+" 个文件未展开显示 ",1)):b("",!0)],64)):(n(),o("span",ie,"暂未选择待清洗文件"))])]),e[8]||(e[8]=s("div",{class:"section-title"},"保留列设置",-1)),s("div",ue,[s("div",ce,[s("span",de,"已选择 "+i(c.value.length)+" / "+i(p.value.length)+" 列",1),s("div",{class:"column-actions"},[s("button",{type:"button",class:"opt-btn small",onClick:$},"全选"),s("button",{type:"button",class:"opt-btn small",onClick:A},"清空")])]),p.value.length?(n(),o("div",ve,[(n(!0),o(C,null,F(p.value,t=>(n(),o("label",{key:t,class:I(["column-item",{active:c.value.includes(t)}])},[P(s("input",{"onUpdate:modelValue":e[0]||(e[0]=a=>c.value=a),type:"checkbox",value:t},null,8,pe),[[B,c.value]]),s("span",null,i(t),1)],2))),128))])):(n(),o("div",fe,"请选择 Excel 文件后读取表头并填充可保留列")),e[4]||(e[4]=s("div",{class:"desc"},"读取首个 Excel 文件的第一行作为表头,用于动态选择需要保留的列。",-1))]),e[9]||(e[9]=s("div",{class:"section-title"},"ID 保留规则",-1)),s("div",_e,[s("label",{class:I(["radio-item",{active:_.value}])},[P(s("input",{"onUpdate:modelValue":e[1]||(e[1]=t=>_.value=t),type:"checkbox"},null,512),[[B,_.value]]),e[5]||(e[5]=s("div",null,[s("span",{class:"label"},"保留子链接"),s("div",{class:"desc"},"例如 1_1、2_3 这种带下划线的子项 ID")],-1))],2),s("label",{class:I(["radio-item",{active:m.value}])},[P(s("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>m.value=t),type:"checkbox"},null,512),[[B,m.value]]),e[6]||(e[6]=s("div",null,[s("span",{class:"label"},"仅剩主链接无子链接"),s("div",{class:"desc"},"当某个主链接只有 13 这类主 ID、没有 13_1 这类对应子 ID 时,自动保留该主 ID")],-1))],2)]),s("div",me,[s("button",{type:"button",class:"btn-run",disabled:h.value,onClick:V},i(h.value?"清洗中...":"开始清洗"),9,he),s("span",ge,i(h.value?"正在处理文件并上传结果,请稍候…":"选择文件、列和 ID 规则后即可执行清洗,结果会显示在右侧供下载"),1)])]),s("section",ye,[e[14]||(e[14]=s("div",{class:"panel-header"},"去重结果",-1)),s("div",be,[s("div",we,[s("div",ke,[e[10]||(e[10]=s("span",{class:"summary-label"},"已处理文件",-1)),s("strong",null,i(g.value.total),1)]),s("div",Ce,[e[11]||(e[11]=s("span",{class:"summary-label"},"成功结果",-1)),s("strong",null,i(g.value.successCount),1)]),s("div",Ie,[e[12]||(e[12]=s("span",{class:"summary-label"},"失败文件",-1)),s("strong",null,i(g.value.failedCount),1)])]),s("div",xe,[e[13]||(e[13]=s("div",{class:"result-list-header"},[s("span",null,"处理后的 Excel 列表")],-1)),k.value.length===0?(n(),o("div",Ee," 暂无去重结果,完成数据去重后会在这里展示输出文件 ")):(n(),o("ul",De,[(n(!0),o(C,null,F(k.value,t=>(n(),o("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}`,class:"task-item"},[s("div",Fe,[s("span",{class:"id",title:t.sourceFilename},i(t.sourceFilename||"-"),9,Pe),t.outputFilename?(n(),o("div",Be,"输出文件:"+i(t.outputFilename),1)):b("",!0),t.error?(n(),o("div",Se,"错误信息:"+i(t.error),1)):b("",!0)]),s("div",Ue,[s("span",{class:I(["status",t.success?"success":"failed"])},i(t.success?"已完成":"失败"),3),t.success&&t.downloadUrl?(n(),o("button",{key:0,type:"button",class:"download",onClick:a=>T(t)}," 下载文件 ",8,Ne)):b("",!0),t.resultId?(n(),o("button",{key:1,type:"button",class:"btn-delete",onClick:a=>M(t.resultId)}," 删除 ",8,$e)):b("",!0)])]))),128))]))])])])])]))}}),He=Y(Ae,[["__scopeId","data-v-bdaefe1c"]]);Z(He).use(ee).mount("#app"); +import{d as z,o as W,a as n,c as o,b as q,B as J,e as s,F as C,r as F,t as i,f as b,n as I,w as P,v as B,g as u,h as L,i as x,E as r,j as O,k as G,l as Q,m as X,_ as Y,p as Z,q as ee}from"./pywebview-Bt854mYs.js";import{e as se}from"./brand-5-W0Wonr.js";const te={class:"page-shell module-page"},le={class:"main-content"},ae={class:"left-panel"},ne={class:"upload-zone"},oe={class:"selected-files clean-placeholder"},re={key:0,class:"more-line"},ie={key:1},ue={class:"option-group column-option-group"},ce={class:"column-toolbar"},de={class:"column-count"},ve={key:0,class:"column-grid"},pe=["value"],fe={key:1,class:"empty-column-state"},_e={class:"option-group"},me={class:"run-row"},he=["disabled"],ge={class:"loading-msg"},ye={class:"right-panel"},be={class:"task-list-wrap"},we={class:"clean-result-summary"},ke={class:"summary-card"},Ce={class:"summary-card"},Ie={class:"summary-card"},xe={class:"result-list-wrap"},Ee={key:0,class:"empty-tasks"},De={key:1,class:"task-list clean-result-list"},Fe={class:"left"},Pe=["title"],Be={key:0,class:"files"},Se={key:1,class:"files"},Ue={class:"task-right"},Ne=["onClick"],$e=["onClick"],Ae=z({__name:"BrandDedupeTab",setup(Ke){const p=u([]),c=u([]),f=u([]),w=u(""),d=u([]),S=u(!1),_=u(!0),m=u(!0),h=u(!1),k=u([]),g=u({total:0,successCount:0,failedCount:0,items:[]}),E=L(()=>f.value.slice(0,8));function $(){c.value=[...p.value]}function A(){c.value=[]}async function U(l){const e=x();if(!e?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const a of l){const v=typeof a=="string"?a:a.absolutePath,j=typeof a=="string"?void 0:a.relativePath,y=await e.upload_file_to_java(v,j);if(!y?.success||!y.data)throw new Error(y?.error||y?.message||`上传失败:${v}`);t.push(y.data)}return t}async function N(l){const e=await X(l);if(!e.headers?.length){r.error("读取 Excel 表头失败"),p.value=[],c.value=[];return}const t=["id","ASIN","国家","价格","卖家名称"],a=[...t.filter(v=>e.headers?.includes(v)),...(e.headers||[]).filter(v=>!t.includes(v))];p.value=a,c.value=t.filter(v=>a.includes(v))}async function H(l,e){f.value=l,w.value="",d.value=await U(l),d.value.length>0&&await N(d.value[0].fileKey),r.success(e)}async function K(){const l=x();if(!l?.select_brand_xlsx_files){r.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const e=await l.select_brand_xlsx_files();if(!e?.length)return;await H(e,`已选择 ${e.length} 个待清洗文件`)}catch(e){r.error(e instanceof Error?e.message:"选择失败")}}async function R(){const l=x();if(!l?.select_brand_folder){r.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const e=await l.select_brand_folder();if(!e)return;w.value=e.split(/[/\\]/).filter(Boolean).pop()||"";const t=await se(e);if(t.success&&t.items?.length){f.value=t.items.map(a=>a.relativePath),d.value=await U(t.items),d.value.length>0&&await N(d.value[0].fileKey),r.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`);return}r.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(e){r.error(e instanceof Error?e.message:"选择失败")}}async function V(){if(!d.value.length){r.warning("请先选择待清洗 Excel 文件或文件夹");return}if(!c.value.length){r.warning("请至少选择一列保留列");return}if(!S.value&&!_.value&&!m.value){r.warning("请至少选择一种 ID 保留规则");return}try{h.value=!0;const l=await O({files:d.value.map(e=>({fileKey:e.fileKey,originalFilename:e.originalFilename,relativePath:e.relativePath})),selectedColumns:c.value,keepIntegerIds:S.value,keepUnderscoreIds:_.value,keepIntegerMainIdsWhenNoSubIds:m.value,archiveName:d.value.some(e=>!!e.relativePath)&&w.value?w.value:void 0});g.value=l,k.value=l.items||[],await D(),r.success("数据去重完成")}catch(l){r.error(l instanceof Error?l.message:"去重失败")}finally{h.value=!1}}async function D(){try{const l=await G();k.value=l.items||[],g.value={total:l.items?.length||0,successCount:l.items?.filter(e=>e.success).length||0,failedCount:l.items?.filter(e=>!e.success).length||0,items:l.items||[]}}catch{}}async function M(l){try{await Q(l),await D(),r.success("已删除")}catch(e){r.error(e instanceof Error?e.message:"删除失败")}}async function T(l){const e=x();if(!l.downloadUrl){r.warning("当前结果没有下载地址");return}const t=l.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}_cleaned.xlsx`;if(e?.save_file_from_url_new){const a=await e.save_file_from_url_new(l.downloadUrl,t);a.success?r.success(`已保存:${a.path||t}`):a.error&&a.error!=="用户取消"&&r.error(a.error);return}}return W(()=>{D().catch(()=>{})}),(l,e)=>(n(),o("div",te,[q(J,{active:"dedupe"}),s("div",le,[s("aside",ae,[e[7]||(e[7]=s("div",{class:"section-title"},"选择文件",-1)),s("div",ne,[e[3]||(e[3]=s("div",{class:"hint"},"选择需要清洗的 Excel 文件或文件夹,后续将按所选规则输出处理结果。",-1)),s("div",{class:"btns"},[s("button",{type:"button",class:"opt-btn",onClick:K},"选择 Excel 文件"),s("button",{type:"button",class:"opt-btn",onClick:R},"选择文件夹")]),s("div",oe,[f.value.length?(n(),o(C,{key:0},[(n(!0),o(C,null,F(E.value,t=>(n(),o("span",{key:t},i(t),1))),128)),f.value.length>E.value.length?(n(),o("span",re," 还有 "+i(f.value.length-E.value.length)+" 个文件未展开显示 ",1)):b("",!0)],64)):(n(),o("span",ie,"暂未选择待清洗文件"))])]),e[8]||(e[8]=s("div",{class:"section-title"},"保留列设置",-1)),s("div",ue,[s("div",ce,[s("span",de,"已选择 "+i(c.value.length)+" / "+i(p.value.length)+" 列",1),s("div",{class:"column-actions"},[s("button",{type:"button",class:"opt-btn small",onClick:$},"全选"),s("button",{type:"button",class:"opt-btn small",onClick:A},"清空")])]),p.value.length?(n(),o("div",ve,[(n(!0),o(C,null,F(p.value,t=>(n(),o("label",{key:t,class:I(["column-item",{active:c.value.includes(t)}])},[P(s("input",{"onUpdate:modelValue":e[0]||(e[0]=a=>c.value=a),type:"checkbox",value:t},null,8,pe),[[B,c.value]]),s("span",null,i(t),1)],2))),128))])):(n(),o("div",fe,"请选择 Excel 文件后读取表头并填充可保留列")),e[4]||(e[4]=s("div",{class:"desc"},"读取首个 Excel 文件的第一行作为表头,用于动态选择需要保留的列。",-1))]),e[9]||(e[9]=s("div",{class:"section-title"},"ID 保留规则",-1)),s("div",_e,[s("label",{class:I(["radio-item",{active:_.value}])},[P(s("input",{"onUpdate:modelValue":e[1]||(e[1]=t=>_.value=t),type:"checkbox"},null,512),[[B,_.value]]),e[5]||(e[5]=s("div",null,[s("span",{class:"label"},"保留子链接"),s("div",{class:"desc"},"例如 1_1、2_3 这种带下划线的子项 ID")],-1))],2),s("label",{class:I(["radio-item",{active:m.value}])},[P(s("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>m.value=t),type:"checkbox"},null,512),[[B,m.value]]),e[6]||(e[6]=s("div",null,[s("span",{class:"label"},"仅剩主链接无子链接"),s("div",{class:"desc"},"当某个主链接只有 13 这类主 ID、没有 13_1 这类对应子 ID 时,自动保留该主 ID")],-1))],2)]),s("div",me,[s("button",{type:"button",class:"btn-run",disabled:h.value,onClick:V},i(h.value?"清洗中...":"开始清洗"),9,he),s("span",ge,i(h.value?"正在处理文件并上传结果,请稍候…":"选择文件、列和 ID 规则后即可执行清洗,结果会显示在右侧供下载"),1)])]),s("section",ye,[e[14]||(e[14]=s("div",{class:"panel-header"},"去重结果",-1)),s("div",be,[s("div",we,[s("div",ke,[e[10]||(e[10]=s("span",{class:"summary-label"},"已处理文件",-1)),s("strong",null,i(g.value.total),1)]),s("div",Ce,[e[11]||(e[11]=s("span",{class:"summary-label"},"成功结果",-1)),s("strong",null,i(g.value.successCount),1)]),s("div",Ie,[e[12]||(e[12]=s("span",{class:"summary-label"},"失败文件",-1)),s("strong",null,i(g.value.failedCount),1)])]),s("div",xe,[e[13]||(e[13]=s("div",{class:"result-list-header"},[s("span",null,"处理后的 Excel 列表")],-1)),k.value.length===0?(n(),o("div",Ee," 暂无去重结果,完成数据去重后会在这里展示输出文件 ")):(n(),o("ul",De,[(n(!0),o(C,null,F(k.value,t=>(n(),o("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}`,class:"task-item"},[s("div",Fe,[s("span",{class:"id",title:t.sourceFilename},i(t.sourceFilename||"-"),9,Pe),t.outputFilename?(n(),o("div",Be,"输出文件:"+i(t.outputFilename),1)):b("",!0),t.error?(n(),o("div",Se,"错误信息:"+i(t.error),1)):b("",!0)]),s("div",Ue,[s("span",{class:I(["status",t.success?"success":"failed"])},i(t.success?"已完成":"失败"),3),t.success&&t.downloadUrl?(n(),o("button",{key:0,type:"button",class:"download",onClick:a=>T(t)}," 下载文件 ",8,Ne)):b("",!0),t.resultId?(n(),o("button",{key:1,type:"button",class:"btn-delete",onClick:a=>M(t.resultId)}," 删除 ",8,$e)):b("",!0)])]))),128))]))])])])])]))}}),He=Y(Ae,[["__scopeId","data-v-bdaefe1c"]]);Z(He).use(ee).mount("#app"); diff --git a/app/assets/delete-brand.js b/app/assets/delete-brand.js index cac4617..5400743 100644 --- a/app/assets/delete-brand.js +++ b/app/assets/delete-brand.js @@ -1 +1 @@ -import{d as Ye,o as Ze,I as es,a as d,c as f,b as ss,B as ts,e as l,F as H,r as fe,t as v,f as h,J as ns,K as De,n as Me,g as y,h as J,L as as,i as G,E as p,M as ls,N as rs,O as os,P as us,Q as is,_ as cs,p as ds,q as fs}from"./pywebview-CeWJDVeG.js";import{e as vs}from"./brand-UU-ckLq6.js";const hs={class:"page-shell module-page"},ps={class:"main-content"},_s={class:"left-panel"},ys={class:"upload-zone"},gs={class:"selected-files clean-placeholder split-selected-files"},ms={key:0,class:"more-line"},ks={key:1},ws={class:"run-row"},Is=["disabled"],bs=["disabled"],Ss={class:"loading-msg"},Ts={key:0,class:"queue-debug-card"},Cs={key:0,class:"queue-debug-line"},Es={key:1,class:"queue-debug-payload"},Fs={class:"right-panel"},Ps={class:"task-list-wrap"},Rs={class:"clean-result-summary"},xs={class:"summary-card"},Ns={class:"summary-card"},$s={class:"summary-card"},As={class:"result-list-wrap"},Ds={key:0,class:"empty-tasks"},Ms={key:0,class:"result-subsection"},Bs={class:"task-list clean-result-list"},qs={class:"left split-result-main"},Ls=["title"],Us={class:"files"},Os={class:"files"},Ks={key:0,class:"files"},Hs={key:1,class:"files"},Js={key:2,class:"files"},Gs={key:3,class:"time"},js={key:4,class:"delete-brand-progress-block"},zs={class:"delete-brand-progress-header"},Vs={class:"delete-brand-progress-bar"},Qs={class:"files delete-brand-progress"},Xs={key:5,class:"files split-entry-list delete-brand-preview"},Ws={key:6,class:"files"},Ys={class:"task-right split-result-actions"},Zs=["onClick"],et=["onClick"],st={key:1,class:"result-subsection"},tt={class:"task-list clean-result-list"},nt={class:"left split-result-main"},at=["title"],lt={class:"files"},rt={class:"files"},ot={key:0,class:"files"},ut={key:1,class:"files"},it={key:2,class:"time"},ct={key:3,class:"delete-brand-progress-block"},dt={class:"delete-brand-progress-header"},ft={class:"delete-brand-progress-bar"},vt={class:"files delete-brand-progress"},ht={key:4,class:"files split-entry-list delete-brand-preview"},pt={key:5,class:"files"},_t={class:"task-right split-result-actions"},yt=["onClick"],gt=["onClick"],mt=Ye({__name:"BrandDeleteBrandTab",setup(wt){function $(){return`delete-brand:current-tasks:${typeof window<"u"&&window.localStorage.getItem("uid")||"0"}`}const A=y([]),j=y([]),B=y(!1),ve=y([]),i=y([]),q=y([]),z=y({total:0,successCount:0,failedCount:0,items:[]}),b=y(""),S=y(""),g=y({}),T=y(null),ee=y(!1),V=y(!1),E=y(!1),D=y(""),Q=y(!1),L=y(null),se=y(!1),te=J(()=>A.value.slice(0,10)),F=J(()=>{const e=[];return i.value.forEach(s=>{e.push(...s.items)}),e});function Be(){try{const e=typeof window<"u"?window.localStorage.getItem($()):null;if(e){if(i.value=JSON.parse(e),i.value.length>0){const s=i.value[i.value.length-1];b.value=s.queuePushResult||"",S.value=s.queuePayloadText||""}}else i.value=[]}catch{i.value=[]}}function ne(e,s,t,n){if(!s?.length)return;const a=i.value.findIndex(c=>c.taskId===e),o=a>=0?i.value[a]:null,r=s.map(c=>{const _=o?.items.find(We=>M(We,c)),k=Array.isArray(c.countries)?c.countries:void 0,m=Array.isArray(_?.countries)?_?.countries:void 0,w=k&&k.length>0?k:m&&m.length>0?m:k??m,I=Array.isArray(c.previewRows)?c.previewRows:void 0,C=Array.isArray(_?.previewRows)?_?.previewRows:void 0,de=I&&I.length>0?I:C&&C.length>0?C:I??C;return{...c,countries:w,previewRows:de,_pushed:_?._pushed??c._pushed??!1,_completed:_?._completed??c._completed??!1}}),u={taskId:e,items:r,createdAt:o?.createdAt||Date.now(),queuePushResult:t??o?.queuePushResult,queuePayloadText:n??o?.queuePayloadText};a>=0?i.value[a]=u:i.value.push(u),typeof window<"u"&&window.localStorage.setItem($(),JSON.stringify(i.value))}function he(e){const s=i.value.length;i.value=i.value.filter(t=>t.taskId!==e),i.value.length!==s&&typeof window<"u"&&window.localStorage.setItem($(),JSON.stringify(i.value))}function pe(e){return e==="SUCCESS"||e==="FAILED"||e==="COMPLETED"}function qe(e){if(!e?.length)return!1;const s=new Set;if(e.forEach(n=>{n.taskId&&pe(n.taskStatus)&&s.add(n.taskId)}),!s.size)return!1;const t=i.value.length;return i.value=i.value.filter(n=>!s.has(n.taskId)),i.value.length!==t?(ae(),!0):!1}const X=J(()=>q.value.filter(e=>!F.value.some(s=>M(s,e)))),Le=J(()=>F.value.length>0||X.value.length>0),Ue=J(()=>F.value.filter(e=>xe(e)&&P(e)==="未入队"));function ae(){typeof window<"u"&&(i.value.length===0?window.localStorage.removeItem($()):window.localStorage.setItem($(),JSON.stringify(i.value)))}function R(e){return e?(i.value.find(t=>t.taskId===e)?.items.length||0)>1:!1}function le(e){return e&&i.value.find(s=>s.taskId===e)||null}function M(e,s){return!e||!s?!1:e.resultId!=null&&s.resultId!=null?e.resultId===s.resultId:e.fileKey&&s.fileKey?e.fileKey===s.fileKey:e.sourceFilename===s.sourceFilename}function x(e,s){const t=le(e);return t&&t.items.find(n=>M(n,s))||null}function _e(e){if(!e)return!1;const s=le(e);if(!s)return!1;let t=!1;const n=g.value[e]?.line_progress?.info,a=R(e);if(n?.file_name&&n.current_line!=null&&n.total_lines!=null&&n.total_lines>0&&n.current_line>=n.total_lines){const o=s.items.find(r=>r.sourceFilename===n.file_name);o&&!o._completed&&(o._completed=!0,t=!0)}if(!a){const o=g.value[e]?.task?.status;if((o==="SUCCESS"||o==="FAILED")&&s.items.length===1){const r=s.items[0];r&&!r._completed&&(r._completed=!0,t=!0)}}return t&&ae(),t}function ye(e){return e&&g.value[e]?.task?.status||""}function W(e){if(e.error)return e.error;if(e.matchStatus&&e.matchStatus!=="MATCHED")return e.matchMessage||"";const s=e.taskId;return s&&g.value[s]?.task?.errorMessage||""}function ge(e){const s=e.taskId;if(!s)return!1;const t=g.value[s]?.line_progress,n=ye(s),a=R(s),o=P(e);if(a){const r=x(s,e),u=K(e)===D.value,c=!!(t?.has_progress&&t?.info?.file_name===e.sourceFilename);return u||c||r?._pushed||(n==="RUNNING"||n==="PENDING"||!n)&&r?._completed?!0:{success:!1,retryable:!0}}return o==="本文件解析完毕"||o==="已被全局判定为终态"?!1:t?.has_progress||t?.info?!0:o==="已入队"||o==="处理中"}function me(e){return e.map(s=>s.matchStatus==="MATCHED"?{...s,_pushed:!1,_completed:!1}:{...s,matched:!1,openStoreUrl:void 0,error:s.error||void 0,_pushed:!1,_completed:!1})}function ke(e){return e.matchStatus==="MATCHED"?`已匹配 ${e.shopId||""}`.trim():e.matchMessage?e.matchMessage:e.matchStatus==="CONFLICT"?"存在多个同名店铺,请人工确认":e.matchStatus==="PENDING"||e.matchStatus==="INDEX_STALE"?"店铺索引暂未就绪":e.matchStatus?e.matchStatus:e.matched?`已匹配 ${e.shopId||""}`.trim():"待匹配"}function Oe(){ve.value=[...F.value,...X.value]}function N(){Oe(),Ke(ve.value)}function Ke(e){z.value={total:e.length,successCount:e.filter(s=>s.success).length,failedCount:e.filter(s=>!s.success).length,items:e}}function re(e){const s=e.taskId;return s&&(g.value[s]?.fileProgress||[]).find(a=>a.fileKey&&e.fileKey?a.fileKey===e.fileKey:a.sourceFilename&&e.sourceFilename?a.sourceFilename===e.sourceFilename:!1)||null}function we(e){const s=e.taskId;if(!s)return"";const t=g.value[s],n=t?.line_progress?.info,a=re(e);if(R(s)){const u=x(s,e),c=t?.task?.status,_=!!(n?.file_name&&n.file_name===e.sourceFilename);let k=u?._completed?"COMPLETED":(u?._pushed,"PENDING"),m=0,w=Math.max(0,e.totalRows??a?.totalRows??0);c==="SUCCESS"||c==="FAILED"&&u?._completed?(k="COMPLETED",m=w):_?(k="RUNNING",m=Math.max(0,Math.min(w||Number.MAX_SAFE_INTEGER,n?.current_line??0)),!w&&n?.total_lines&&n.total_lines>0&&(w=n.total_lines)):u?._completed?(k="COMPLETED",m=w):u?._pushed&&(k="PENDING",m=0);const I=[];if(I.push(`文件状态:${k}`),I.push(`文件进度:${m}/${w}`),n?.finished_files!=null){const C=n.file_total&&n.file_total>0?`/${n.file_total}`:"";I.push(`已完成文件:${n.finished_files}${C}`)}return n?.phase&&I.push(`阶段:${n.phase}`),I.join("|")}if(a){const u=[],c=a.processedRows??0,_=a.totalRows??0;if(a.status&&u.push(`文件状态:${a.status}`),u.push(`文件进度:${c}/${_}`),n?.finished_files!=null){const k=n.file_total&&n.file_total>0?`/${n.file_total}`:"";u.push(`已完成文件:${n.finished_files}${k}`)}return n?.phase&&u.push(`阶段:${n.phase}`),u.join("|")}if(!t?.line_progress?.has_progress||!n){const u=t?.task?.status;return u?`任务状态:${u}`:""}const r=[];if(n.phase&&r.push(`阶段:${n.phase}`),n.file_index&&n.file_total&&r.push(`文件:${n.file_index}/${n.file_total}`),n.file_name&&r.push(`当前文件:${n.file_name}`),n.current_line!=null&&n.total_lines!=null&&r.push(`${R(s)?"当前文件进度":"进度"}:${n.current_line}/${n.total_lines}`),n.current_country&&r.push(`国家:${n.current_country}`),n.current_asin&&r.push(`ASIN:${n.current_asin}`),n.finished_files!=null){const u=n.file_total&&n.file_total>0?`/${n.file_total}`:"";r.push(`已完成文件:${n.finished_files}${u}`)}return r.join("|")}function Y(e){const s=e.taskId;if(!s)return 0;const t=g.value[s]?.line_progress?.info;if(R(s)){const r=x(s,e);if(g.value[s]?.task?.status==="SUCCESS"||r?._completed)return 100;const c=Math.max(0,e.totalRows??re(e)?.totalRows??0);if(!!(t?.file_name&&t.file_name===e.sourceFilename)){if(t?.current_line!=null&&t?.total_lines&&t.total_lines>0)return Math.max(0,Math.min(100,Math.round(t.current_line/t.total_lines*100)));if(t?.current_line!=null&&c>0)return Math.max(0,Math.min(100,Math.round(t.current_line/c*100)))}return 0}const a=re(e);return a?Math.max(0,Math.min(100,a.percent??0)):t?t.current_line!=null&&t.total_lines&&t.total_lines>0?Math.max(0,Math.min(100,Math.round(t.current_line/t.total_lines*100))):t.finished_files!=null&&t.file_total&&t.file_total>0?Math.max(0,Math.min(100,Math.round(t.finished_files/t.file_total*100))):g.value[s]?.task?.status==="SUCCESS"?100:0:0}function Ie(e){const s=g.value[e]?.task?.status;return pe(s)}function U(){const e=new Set;return i.value.forEach(s=>{s.items.some(t=>t._pushed)&&e.add(s.taskId)}),Array.from(e)}function P(e){const s=e.taskId;if(!s||!le(s))return"";const n=x(s,e),a=ye(s),o=g.value[s]?.line_progress,r=R(s);if(!r&&(a==="SUCCESS"||a==="FAILED"||e.taskStatus==="SUCCESS"||e.taskStatus==="FAILED"))return"已被全局判定为终态";if(n?._completed)return"本文件解析完毕";if(a==="RUNNING"&&o?.has_progress&&o?.info?.file_name===e.sourceFilename)return"处理中";if(r&&!n?._pushed&&!n?._completed)return"未入队";if(r&&a==="SUCCESS")return"本文件解析完毕";if(!r){const u=g.value[s];if(u?.items&&u.items.find(_=>M(_,e))&&a==="SUCCESS")return"本文件解析完毕"}return n?._pushed?"已入队":"未入队"}function be(e){if(e.downloadUrl)return!0;const s=e.taskId;return s?g.value[s]?.task?.status==="SUCCESS":{success:!1,retryable:!1}}function He(e){const s=e?.task?.id;if(!s)return!1;const t=i.value.find(r=>r.taskId===s);if(!t)return{success:!1,retryable:!1};const n=e?.items||[];let a=!1;const o=t.items.map(r=>{const u=n.find(de=>M(de,r));if(!u)return r;const c=Array.isArray(u.countries)?u.countries:void 0,_=Array.isArray(r.countries)?r.countries:void 0,k=c&&c.length>0?c:_&&_.length>0?_:c??_,m=Array.isArray(u.previewRows)?u.previewRows:void 0,w=Array.isArray(r.previewRows)?r.previewRows:void 0,I=m&&m.length>0?m:w&&w.length>0?w:m??w,C={...r,...u,countries:k,previewRows:I,_pushed:r._pushed,_completed:r._completed};return JSON.stringify(C)!==JSON.stringify(r)&&(a=!0),C});for(const r of n)o.some(u=>M(u,r))||(o.push({...r,_pushed:!1,_completed:!1}),a=!0);return JSON.stringify(o)!==JSON.stringify(t.items)&&(t.items=o,a=!0),a&&ae(),a}async function oe(e){const s=e||U();if(s.length)try{const t=await as(s);se.value&&E.value&&(b.value="后端已恢复,继续执行当前任务并自动衔接后续任务..."),se.value=!1;let n=!1;for(const a of t.items||[]){const o=a?.task?.id;typeof o=="number"&&o>0&&(g.value[o]=a,He(a)&&(n=!0),_e(o)&&(n=!0))}n&&N()}catch(t){const n=(t instanceof Error?t.message:String(t||"")).toLowerCase();["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(o=>n.includes(o.toLowerCase()))&&E.value&&(se.value=!0,b.value="当前任务运行中,正在等待后端服务恢复...")}}function Je(){return is()}function ue(e=!1){if(T.value){if(!e)return;clearTimeout(T.value),T.value=null}const s=async()=>{if(T.value=null,ee.value){ue();return}const t=U();if(!t.length)return;ee.value=!0;let n=!1,a=!1;try{await oe(t),await Ae();for(const o of t)Ie(o)&&(he(o),n=!0,a=!0)}finally{ee.value=!1}a?await O():n&&N(),U().length>0&&ue()};e?s():T.value=window.setTimeout(s,Je())}function ie(e=!1){T.value&&!e||ue(e)}function Z(e){const s=e.taskId?g.value[e.taskId]?.task?.status:null;return s==="SUCCESS"?{className:"success",text:"已完成"}:s==="FAILED"?{className:"failed",text:"失败"}:s==="RUNNING"?{className:"running",text:"执行中"}:e.taskStatus==="SUCCESS"?{className:"success",text:"已完成"}:e.taskStatus==="FAILED"?{className:"failed",text:"失败"}:e.taskStatus==="RUNNING"?{className:"running",text:"执行中"}:e.success?{className:"success",text:"已完成"}:{className:"failed",text:"失败"}}function Se(){T.value&&(window.clearTimeout(T.value),T.value=null),ce()}async function Te(e){const s=G();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const n of e){const a=typeof n=="string"?n:n.absolutePath,o=typeof n=="string"?void 0:n.relativePath,r=await s.upload_file_to_java(a,o);if(!r?.success||!r.data)throw new Error(r?.error||r?.message||`上传失败:${a}`);t.push(r.data)}return t}async function Ge(){const e=G();if(!e?.select_brand_xlsx_files){p.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await e.select_brand_xlsx_files();if(!s?.length)return;A.value=s,j.value=await Te(s),p.success(`已选择 ${s.length} 个删除品牌文件`)}catch(s){p.error(s instanceof Error?s.message:"选择失败")}}async function je(){const e=G();if(!e?.select_brand_folder){p.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await e.select_brand_folder();if(!s)return;const t=await vs(s);if(!t.success||!t.items?.length){p.warning(t.error||"该文件夹下没有 xlsx 文件");return}A.value=t.items.map(n=>n.relativePath||n.absolutePath),j.value=await Te(t.items),p.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`)}catch(s){p.error(s instanceof Error?s.message:"选择失败")}}async function ze(){if(!j.value.length){p.warning("请先选择待处理文件");return}try{B.value=!0;const e=await ls({files:j.value.map(a=>({fileKey:a.fileKey,originalFilename:a.originalFilename,relativePath:a.relativePath}))}),s=me(e.items||[]),t=s.some(a=>a.matchStatus==="MATCHED"),n=s.some(a=>a.matchStatus&&a.matchStatus!=="MATCHED");b.value=t?"解析完成,可在左侧点击“推送到 Python 队列”开始串行处理":"解析完成,当前没有可推送的已匹配文件",S.value="",s.length&&s[0].taskId&&ne(s[0].taskId,s,b.value,S.value),N(),n?p.warning("部分文件尚未命中可用店铺索引,已保留状态信息,请等待后台刷新后重试。"):t?p.success("删除品牌解析完成,请在左侧推送到 Python 队列"):p.warning("当前没有可推送的已匹配文件,请先等待店铺索引刷新。"),await O()}catch(e){p.error(e instanceof Error?e.message:"执行失败")}finally{B.value=!1}}async function Ce(e){const s=e.taskId;if(!s){p.warning("未找到任务ID");return}const t=G(),n=rs(s),a=e.outputFilename||e.sourceFilename||`delete-brand_${s}.xlsx`;if(t?.save_file_from_url_new){const o=await t.save_file_from_url_new(n,a);o.success?p.success(`已保存:${o.path||a}`):o.error&&o.error!=="用户取消"&&p.error(o.error);return}}async function O(){try{const e=await os();q.value=me(e.items||[]),qe(q.value),N(),await oe(),ie(!0)}catch(e){const s=(e instanceof Error?e.message:String(e||"")).toLowerCase();["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(n=>s.includes(n.toLowerCase()))||console.error("loadHistory error:",e)}}function Ee(e){i.value.forEach(t=>{t.items=t.items.filter(n=>n.resultId!==e)});const s=i.value.length;i.value=i.value.filter(t=>t.items.length>0),i.value.length!==s&&typeof window<"u"&&window.localStorage.setItem($(),JSON.stringify(i.value)),q.value=q.value.filter(t=>t.resultId!==e),N(),U().length===0&&Se()}async function Fe(e){try{await us(e),Ee(e),await O(),p.success("已删除")}catch(s){const t=s instanceof Error?s.message:"删除失败";if(typeof t=="string"&&t.includes("记录不存在")){Ee(e),p.success("已删除");return}p.error(t)}}function Pe(e){const s=e.slice(0,5).map(n=>`${n.country}:${n.asin}${n.status?`(${n.status})`:""}`);return e.length-s.length>0?`${s.join("、")} 等 ${e.length} 条`:s.join("、")}function It(e,s){}function ce(){L.value&&(window.clearTimeout(L.value),L.value=null)}function Ve(e=3e3){ce(),L.value=window.setTimeout(()=>{L.value=null,Ae().catch(()=>{})},e)}function Qe(e){return e.includes("当前店铺正在执行中")}function Re(){for(const e of i.value)for(const s of e.items){const t=P(s);if(t==="已入队"||t==="处理中")return!0}return!1}function K(e){return e.resultId!=null?`result:${e.resultId}`:`task:${e.taskId||0}:${e.sourceFilename||""}`}function xe(e){return!!(e.taskId&&(e.matchStatus==="MATCHED"||e.matched))}function Ne(){return F.value.find(e=>!xe(e)||K(e)===D.value||x(e.taskId,e)?._completed?!1:P(e)==="未入队")}async function $e(e,s){if(s?.auto&&Re())return e.taskId,e.sourceFilename,{success:!1,retryable:!0};const t=G(),n=e.taskId;if(!n)return{success:!1,retryable:!1};const a=i.value.find(c=>c.taskId===n);if(!a)return{success:!1,retryable:!1};if(!t?.enqueue_json)return p.error("当前环境未启用 pywebview enqueue_json(浏览器环境不会推送)"),{success:!1,retryable:!1};const o={type:"delete-brand-run",ts:Date.now(),data:{taskId:n,items:[e]}};S.value=JSON.stringify(o,null,2);const r=await t.enqueue_json(o);let u="";if(r?.success){u=`已推送文件 ${e.sourceFilename},当前队列长度:${r.queue_size??"-"}`;const c=x(n,e);return c&&(c._pushed=!0,c._completed=!1),D.value=K(e),ne(n,a.items,u,S.value),ie(!0),b.value=u,{success:!0,retryable:!1}}else{const c=r?.error||"未知错误";if(u=`推送到 Python 队列失败:${c}`,b.value=u,ne(n,a.items,u,S.value),s?.auto&&Qe(c))return{success:!1,retryable:!0}}return b.value=u,{success:!1,retryable:!1}}async function Xe(){const e=Ne();if(!e){p.warning("当前没有可推送的已匹配文件");return}V.value=!0,E.value=!0,ce();const s=await $e(e);if(V.value=!1,!s.success){E.value=!1,D.value="";return}p.success("已开始按顺序推送到 Python 队列")}async function Ae(){if(!E.value||Q.value){E.value,Q.value;return}if(Re())return;const e=D.value;if(e){const t=F.value.find(n=>K(n)===e);if(t){const n=t.taskId,a=R(n);a&&(_e(n),P(t),void 0);const o=P(t);if(o==="已入队"||o==="处理中"){t.sourceFilename;return}if(a){const r=x(n,t);if(r&&!r._completed){t.sourceFilename,r._pushed,r._completed;return}}}}const s=Ne();if(!s){D.value="",E.value=!1;return}Q.value=!0;try{s.taskId,s.sourceFilename,K(s);const t=await $e(s,{auto:!0});if(!t.success){if(t.retryable){s.taskId,s.sourceFilename,Ve();return}s.taskId,s.sourceFilename,E.value=!1}}finally{Q.value=!1}}return Ze(()=>{Be();const e=U();e.length>0?oe(e).then(async()=>{let s=!1,t=!1;for(const n of e)Ie(n)&&(he(n),s=!0,t=!0);t?await O():s&&N(),ie(!0)}):N(),O().catch(()=>{})}),es(()=>{Se()}),(e,s)=>(d(),f("div",hs,[ss(ts,{active:"delete-brand"}),l("div",ps,[l("aside",_s,[s[2]||(s[2]=l("div",{class:"section-title"},"选择文件",-1)),l("div",ys,[s[0]||(s[0]=l("div",{class:"hint"},"上传删除品牌 Excel;无论是直接上传文件还是上传文件夹批量导入,都会按每个 Excel 文件名作为店铺名。",-1)),l("div",{class:"btns"},[l("button",{type:"button",class:"opt-btn",onClick:Ge},"选择 Excel 文件"),l("button",{type:"button",class:"opt-btn",onClick:je},"选择文件夹")]),l("div",gs,[A.value.length?(d(),f(H,{key:0},[(d(!0),f(H,null,fe(te.value,t=>(d(),f("span",{key:t},v(t),1))),128)),A.value.length>te.value.length?(d(),f("span",ms," 还有 "+v(A.value.length-te.value.length)+" 个文件未展开显示 ",1)):h("",!0)],64)):(d(),f("span",ks,"暂未选择删除品牌文件"))])]),s[3]||(s[3]=ns('
执行说明
',2)),l("div",ws,[l("button",{type:"button",class:"btn-run",disabled:B.value,onClick:ze},v(B.value?"解析中...":"开始解析"),9,Is),l("button",{type:"button",class:"btn-run btn-queue",disabled:V.value||!Ue.value.length,onClick:Xe},v(V.value?"推送中...":"推送到 Python 队列"),9,bs),l("span",Ss,v(B.value?"正在读取删除品牌数据,请稍候…":"解析后会在右侧展示按国家分组的去重结果"),1)]),b.value||S.value?(d(),f("div",Ts,[s[1]||(s[1]=l("div",{class:"section-title queue-debug-title"},"Python 队列推送结果",-1)),b.value?(d(),f("div",Cs,v(b.value),1)):h("",!0),S.value?(d(),f("pre",Es,v(S.value),1)):h("",!0)])):h("",!0)]),l("section",Fs,[s[12]||(s[12]=l("div",{class:"panel-header"},"删除品牌结果",-1)),l("div",Ps,[l("div",Rs,[l("div",xs,[s[4]||(s[4]=l("span",{class:"summary-label"},"已处理文件",-1)),l("strong",null,v(z.value.total),1)]),l("div",Ns,[s[5]||(s[5]=l("span",{class:"summary-label"},"成功结果",-1)),l("strong",null,v(z.value.successCount),1)]),l("div",$s,[s[6]||(s[6]=l("span",{class:"summary-label"},"失败文件",-1)),l("strong",null,v(z.value.failedCount),1)])]),l("div",As,[s[11]||(s[11]=l("div",{class:"result-list-header"},[l("span",null,"删除品牌结果列表")],-1)),Le.value?(d(),f(H,{key:1},[F.value.length?(d(),f("div",Ms,[s[8]||(s[8]=l("div",{class:"result-subsection-title"},"当前任务",-1)),l("ul",Bs,[(d(!0),f(H,null,fe(F.value,t=>(d(),f("li",{key:`current-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[l("div",qs,[l("span",{class:"id",title:t.sourceFilename},v(t.sourceFilename||"-"),9,Ls),l("div",Us,"店铺名:"+v(t.shopName||"-"),1),l("div",Os,"匹配结果:"+v(ke(t)),1),t.platform?(d(),f("div",Ks,"平台:"+v(t.platform),1)):h("",!0),P(t)?(d(),f("div",Hs,"队列状态:"+v(P(t)),1)):h("",!0),t.countryCount!==void 0&&t.matched?(d(),f("div",Js,"国家数:"+v(t.countryCount),1)):h("",!0),t.totalRows!==void 0&&t.matched?(d(),f("div",Gs,"去重后 "+v(t.totalRows)+" 条 ",1)):h("",!0),ge(t)?(d(),f("div",js,[l("div",zs,[s[7]||(s[7]=l("span",null,"任务进度",-1)),l("span",null,v(Y(t))+"%",1)]),l("div",Vs,[l("div",{class:"delete-brand-progress-bar-fill",style:De({width:`${Y(t)}%`})},null,4)]),l("div",Qs,v(we(t)),1)])):h("",!0),t.previewRows?.length?(d(),f("div",Xs,v(Pe(t.previewRows)),1)):h("",!0),W(t)?(d(),f("div",Ws,"错误信息:"+v(W(t)),1)):h("",!0)]),l("div",Ys,[l("span",{class:Me(["status",Z(t).className])},v(Z(t).text),3),be(t)?(d(),f("button",{key:0,type:"button",class:"download",onClick:n=>Ce(t)}," 下载 ",8,Zs)):h("",!0),t.resultId?(d(),f("button",{key:1,type:"button",class:"btn-delete",onClick:n=>Fe(t.resultId)}," 删除 ",8,et)):h("",!0)])]))),128))])])):h("",!0),X.value.length?(d(),f("div",st,[s[10]||(s[10]=l("div",{class:"result-subsection-title"},"历史记录",-1)),l("ul",tt,[(d(!0),f(H,null,fe(X.value,t=>(d(),f("li",{key:`history-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[l("div",nt,[l("span",{class:"id",title:t.sourceFilename},v(t.sourceFilename||"-"),9,at),l("div",lt,"店铺名:"+v(t.shopName||"-"),1),l("div",rt,"匹配结果:"+v(ke(t)),1),t.platform?(d(),f("div",ot,"平台:"+v(t.platform),1)):h("",!0),t.countryCount!==void 0&&t.matched?(d(),f("div",ut,"国家数:"+v(t.countryCount),1)):h("",!0),t.totalRows!==void 0&&t.matched?(d(),f("div",it,"去重后 "+v(t.totalRows)+" 条 ",1)):h("",!0),ge(t)?(d(),f("div",ct,[l("div",dt,[s[9]||(s[9]=l("span",null,"任务进度",-1)),l("span",null,v(Y(t))+"%",1)]),l("div",ft,[l("div",{class:"delete-brand-progress-bar-fill",style:De({width:`${Y(t)}%`})},null,4)]),l("div",vt,v(we(t)),1)])):h("",!0),t.previewRows?.length?(d(),f("div",ht,v(Pe(t.previewRows)),1)):h("",!0),W(t)?(d(),f("div",pt,"错误信息:"+v(W(t)),1)):h("",!0)]),l("div",_t,[l("span",{class:Me(["status",Z(t).className])},v(Z(t).text),3),be(t)?(d(),f("button",{key:0,type:"button",class:"download",onClick:n=>Ce(t)}," 下载 ",8,yt)):h("",!0),t.resultId?(d(),f("button",{key:1,type:"button",class:"btn-delete",onClick:n=>Fe(t.resultId)}," 删除 ",8,gt)):h("",!0)])]))),128))])])):h("",!0)],64)):(d(),f("div",Ds," 暂无删除品牌结果,完成解析后会在这里展示按国家分组的去重结果 "))])])])])]))}}),kt=cs(mt,[["__scopeId","data-v-64ee024e"]]);ds(kt).use(fs).mount("#app"); +import{d as Ye,o as Ze,I as es,a as d,c as f,b as ss,B as ts,e as l,F as H,r as fe,t as v,f as h,J as ns,K as De,n as Me,g as y,h as J,L as as,i as G,E as p,M as ls,N as rs,O as os,P as us,Q as is,_ as cs,p as ds,q as fs}from"./pywebview-Bt854mYs.js";import{e as vs}from"./brand-5-W0Wonr.js";const hs={class:"page-shell module-page"},ps={class:"main-content"},_s={class:"left-panel"},ys={class:"upload-zone"},gs={class:"selected-files clean-placeholder split-selected-files"},ms={key:0,class:"more-line"},ks={key:1},ws={class:"run-row"},Is=["disabled"],bs=["disabled"],Ss={class:"loading-msg"},Ts={key:0,class:"queue-debug-card"},Cs={key:0,class:"queue-debug-line"},Es={key:1,class:"queue-debug-payload"},Fs={class:"right-panel"},Ps={class:"task-list-wrap"},Rs={class:"clean-result-summary"},xs={class:"summary-card"},Ns={class:"summary-card"},$s={class:"summary-card"},As={class:"result-list-wrap"},Ds={key:0,class:"empty-tasks"},Ms={key:0,class:"result-subsection"},Bs={class:"task-list clean-result-list"},qs={class:"left split-result-main"},Ls=["title"],Us={class:"files"},Os={class:"files"},Ks={key:0,class:"files"},Hs={key:1,class:"files"},Js={key:2,class:"files"},Gs={key:3,class:"time"},js={key:4,class:"delete-brand-progress-block"},zs={class:"delete-brand-progress-header"},Vs={class:"delete-brand-progress-bar"},Qs={class:"files delete-brand-progress"},Xs={key:5,class:"files split-entry-list delete-brand-preview"},Ws={key:6,class:"files"},Ys={class:"task-right split-result-actions"},Zs=["onClick"],et=["onClick"],st={key:1,class:"result-subsection"},tt={class:"task-list clean-result-list"},nt={class:"left split-result-main"},at=["title"],lt={class:"files"},rt={class:"files"},ot={key:0,class:"files"},ut={key:1,class:"files"},it={key:2,class:"time"},ct={key:3,class:"delete-brand-progress-block"},dt={class:"delete-brand-progress-header"},ft={class:"delete-brand-progress-bar"},vt={class:"files delete-brand-progress"},ht={key:4,class:"files split-entry-list delete-brand-preview"},pt={key:5,class:"files"},_t={class:"task-right split-result-actions"},yt=["onClick"],gt=["onClick"],mt=Ye({__name:"BrandDeleteBrandTab",setup(wt){function $(){return`delete-brand:current-tasks:${typeof window<"u"&&window.localStorage.getItem("uid")||"0"}`}const A=y([]),j=y([]),B=y(!1),ve=y([]),i=y([]),q=y([]),z=y({total:0,successCount:0,failedCount:0,items:[]}),b=y(""),S=y(""),g=y({}),T=y(null),ee=y(!1),V=y(!1),E=y(!1),D=y(""),Q=y(!1),L=y(null),se=y(!1),te=J(()=>A.value.slice(0,10)),F=J(()=>{const e=[];return i.value.forEach(s=>{e.push(...s.items)}),e});function Be(){try{const e=typeof window<"u"?window.localStorage.getItem($()):null;if(e){if(i.value=JSON.parse(e),i.value.length>0){const s=i.value[i.value.length-1];b.value=s.queuePushResult||"",S.value=s.queuePayloadText||""}}else i.value=[]}catch{i.value=[]}}function ne(e,s,t,n){if(!s?.length)return;const a=i.value.findIndex(c=>c.taskId===e),o=a>=0?i.value[a]:null,r=s.map(c=>{const _=o?.items.find(We=>M(We,c)),k=Array.isArray(c.countries)?c.countries:void 0,m=Array.isArray(_?.countries)?_?.countries:void 0,w=k&&k.length>0?k:m&&m.length>0?m:k??m,I=Array.isArray(c.previewRows)?c.previewRows:void 0,C=Array.isArray(_?.previewRows)?_?.previewRows:void 0,de=I&&I.length>0?I:C&&C.length>0?C:I??C;return{...c,countries:w,previewRows:de,_pushed:_?._pushed??c._pushed??!1,_completed:_?._completed??c._completed??!1}}),u={taskId:e,items:r,createdAt:o?.createdAt||Date.now(),queuePushResult:t??o?.queuePushResult,queuePayloadText:n??o?.queuePayloadText};a>=0?i.value[a]=u:i.value.push(u),typeof window<"u"&&window.localStorage.setItem($(),JSON.stringify(i.value))}function he(e){const s=i.value.length;i.value=i.value.filter(t=>t.taskId!==e),i.value.length!==s&&typeof window<"u"&&window.localStorage.setItem($(),JSON.stringify(i.value))}function pe(e){return e==="SUCCESS"||e==="FAILED"||e==="COMPLETED"}function qe(e){if(!e?.length)return!1;const s=new Set;if(e.forEach(n=>{n.taskId&&pe(n.taskStatus)&&s.add(n.taskId)}),!s.size)return!1;const t=i.value.length;return i.value=i.value.filter(n=>!s.has(n.taskId)),i.value.length!==t?(ae(),!0):!1}const X=J(()=>q.value.filter(e=>!F.value.some(s=>M(s,e)))),Le=J(()=>F.value.length>0||X.value.length>0),Ue=J(()=>F.value.filter(e=>xe(e)&&P(e)==="未入队"));function ae(){typeof window<"u"&&(i.value.length===0?window.localStorage.removeItem($()):window.localStorage.setItem($(),JSON.stringify(i.value)))}function R(e){return e?(i.value.find(t=>t.taskId===e)?.items.length||0)>1:!1}function le(e){return e&&i.value.find(s=>s.taskId===e)||null}function M(e,s){return!e||!s?!1:e.resultId!=null&&s.resultId!=null?e.resultId===s.resultId:e.fileKey&&s.fileKey?e.fileKey===s.fileKey:e.sourceFilename===s.sourceFilename}function x(e,s){const t=le(e);return t&&t.items.find(n=>M(n,s))||null}function _e(e){if(!e)return!1;const s=le(e);if(!s)return!1;let t=!1;const n=g.value[e]?.line_progress?.info,a=R(e);if(n?.file_name&&n.current_line!=null&&n.total_lines!=null&&n.total_lines>0&&n.current_line>=n.total_lines){const o=s.items.find(r=>r.sourceFilename===n.file_name);o&&!o._completed&&(o._completed=!0,t=!0)}if(!a){const o=g.value[e]?.task?.status;if((o==="SUCCESS"||o==="FAILED")&&s.items.length===1){const r=s.items[0];r&&!r._completed&&(r._completed=!0,t=!0)}}return t&&ae(),t}function ye(e){return e&&g.value[e]?.task?.status||""}function W(e){if(e.error)return e.error;if(e.matchStatus&&e.matchStatus!=="MATCHED")return e.matchMessage||"";const s=e.taskId;return s&&g.value[s]?.task?.errorMessage||""}function ge(e){const s=e.taskId;if(!s)return!1;const t=g.value[s]?.line_progress,n=ye(s),a=R(s),o=P(e);if(a){const r=x(s,e),u=K(e)===D.value,c=!!(t?.has_progress&&t?.info?.file_name===e.sourceFilename);return u||c||r?._pushed||(n==="RUNNING"||n==="PENDING"||!n)&&r?._completed?!0:{success:!1,retryable:!0}}return o==="本文件解析完毕"||o==="已被全局判定为终态"?!1:t?.has_progress||t?.info?!0:o==="已入队"||o==="处理中"}function me(e){return e.map(s=>s.matchStatus==="MATCHED"?{...s,_pushed:!1,_completed:!1}:{...s,matched:!1,openStoreUrl:void 0,error:s.error||void 0,_pushed:!1,_completed:!1})}function ke(e){return e.matchStatus==="MATCHED"?`已匹配 ${e.shopId||""}`.trim():e.matchMessage?e.matchMessage:e.matchStatus==="CONFLICT"?"存在多个同名店铺,请人工确认":e.matchStatus==="PENDING"||e.matchStatus==="INDEX_STALE"?"店铺索引暂未就绪":e.matchStatus?e.matchStatus:e.matched?`已匹配 ${e.shopId||""}`.trim():"待匹配"}function Oe(){ve.value=[...F.value,...X.value]}function N(){Oe(),Ke(ve.value)}function Ke(e){z.value={total:e.length,successCount:e.filter(s=>s.success).length,failedCount:e.filter(s=>!s.success).length,items:e}}function re(e){const s=e.taskId;return s&&(g.value[s]?.fileProgress||[]).find(a=>a.fileKey&&e.fileKey?a.fileKey===e.fileKey:a.sourceFilename&&e.sourceFilename?a.sourceFilename===e.sourceFilename:!1)||null}function we(e){const s=e.taskId;if(!s)return"";const t=g.value[s],n=t?.line_progress?.info,a=re(e);if(R(s)){const u=x(s,e),c=t?.task?.status,_=!!(n?.file_name&&n.file_name===e.sourceFilename);let k=u?._completed?"COMPLETED":(u?._pushed,"PENDING"),m=0,w=Math.max(0,e.totalRows??a?.totalRows??0);c==="SUCCESS"||c==="FAILED"&&u?._completed?(k="COMPLETED",m=w):_?(k="RUNNING",m=Math.max(0,Math.min(w||Number.MAX_SAFE_INTEGER,n?.current_line??0)),!w&&n?.total_lines&&n.total_lines>0&&(w=n.total_lines)):u?._completed?(k="COMPLETED",m=w):u?._pushed&&(k="PENDING",m=0);const I=[];if(I.push(`文件状态:${k}`),I.push(`文件进度:${m}/${w}`),n?.finished_files!=null){const C=n.file_total&&n.file_total>0?`/${n.file_total}`:"";I.push(`已完成文件:${n.finished_files}${C}`)}return n?.phase&&I.push(`阶段:${n.phase}`),I.join("|")}if(a){const u=[],c=a.processedRows??0,_=a.totalRows??0;if(a.status&&u.push(`文件状态:${a.status}`),u.push(`文件进度:${c}/${_}`),n?.finished_files!=null){const k=n.file_total&&n.file_total>0?`/${n.file_total}`:"";u.push(`已完成文件:${n.finished_files}${k}`)}return n?.phase&&u.push(`阶段:${n.phase}`),u.join("|")}if(!t?.line_progress?.has_progress||!n){const u=t?.task?.status;return u?`任务状态:${u}`:""}const r=[];if(n.phase&&r.push(`阶段:${n.phase}`),n.file_index&&n.file_total&&r.push(`文件:${n.file_index}/${n.file_total}`),n.file_name&&r.push(`当前文件:${n.file_name}`),n.current_line!=null&&n.total_lines!=null&&r.push(`${R(s)?"当前文件进度":"进度"}:${n.current_line}/${n.total_lines}`),n.current_country&&r.push(`国家:${n.current_country}`),n.current_asin&&r.push(`ASIN:${n.current_asin}`),n.finished_files!=null){const u=n.file_total&&n.file_total>0?`/${n.file_total}`:"";r.push(`已完成文件:${n.finished_files}${u}`)}return r.join("|")}function Y(e){const s=e.taskId;if(!s)return 0;const t=g.value[s]?.line_progress?.info;if(R(s)){const r=x(s,e);if(g.value[s]?.task?.status==="SUCCESS"||r?._completed)return 100;const c=Math.max(0,e.totalRows??re(e)?.totalRows??0);if(!!(t?.file_name&&t.file_name===e.sourceFilename)){if(t?.current_line!=null&&t?.total_lines&&t.total_lines>0)return Math.max(0,Math.min(100,Math.round(t.current_line/t.total_lines*100)));if(t?.current_line!=null&&c>0)return Math.max(0,Math.min(100,Math.round(t.current_line/c*100)))}return 0}const a=re(e);return a?Math.max(0,Math.min(100,a.percent??0)):t?t.current_line!=null&&t.total_lines&&t.total_lines>0?Math.max(0,Math.min(100,Math.round(t.current_line/t.total_lines*100))):t.finished_files!=null&&t.file_total&&t.file_total>0?Math.max(0,Math.min(100,Math.round(t.finished_files/t.file_total*100))):g.value[s]?.task?.status==="SUCCESS"?100:0:0}function Ie(e){const s=g.value[e]?.task?.status;return pe(s)}function U(){const e=new Set;return i.value.forEach(s=>{s.items.some(t=>t._pushed)&&e.add(s.taskId)}),Array.from(e)}function P(e){const s=e.taskId;if(!s||!le(s))return"";const n=x(s,e),a=ye(s),o=g.value[s]?.line_progress,r=R(s);if(!r&&(a==="SUCCESS"||a==="FAILED"||e.taskStatus==="SUCCESS"||e.taskStatus==="FAILED"))return"已被全局判定为终态";if(n?._completed)return"本文件解析完毕";if(a==="RUNNING"&&o?.has_progress&&o?.info?.file_name===e.sourceFilename)return"处理中";if(r&&!n?._pushed&&!n?._completed)return"未入队";if(r&&a==="SUCCESS")return"本文件解析完毕";if(!r){const u=g.value[s];if(u?.items&&u.items.find(_=>M(_,e))&&a==="SUCCESS")return"本文件解析完毕"}return n?._pushed?"已入队":"未入队"}function be(e){if(e.downloadUrl)return!0;const s=e.taskId;return s?g.value[s]?.task?.status==="SUCCESS":{success:!1,retryable:!1}}function He(e){const s=e?.task?.id;if(!s)return!1;const t=i.value.find(r=>r.taskId===s);if(!t)return{success:!1,retryable:!1};const n=e?.items||[];let a=!1;const o=t.items.map(r=>{const u=n.find(de=>M(de,r));if(!u)return r;const c=Array.isArray(u.countries)?u.countries:void 0,_=Array.isArray(r.countries)?r.countries:void 0,k=c&&c.length>0?c:_&&_.length>0?_:c??_,m=Array.isArray(u.previewRows)?u.previewRows:void 0,w=Array.isArray(r.previewRows)?r.previewRows:void 0,I=m&&m.length>0?m:w&&w.length>0?w:m??w,C={...r,...u,countries:k,previewRows:I,_pushed:r._pushed,_completed:r._completed};return JSON.stringify(C)!==JSON.stringify(r)&&(a=!0),C});for(const r of n)o.some(u=>M(u,r))||(o.push({...r,_pushed:!1,_completed:!1}),a=!0);return JSON.stringify(o)!==JSON.stringify(t.items)&&(t.items=o,a=!0),a&&ae(),a}async function oe(e){const s=e||U();if(s.length)try{const t=await as(s);se.value&&E.value&&(b.value="后端已恢复,继续执行当前任务并自动衔接后续任务..."),se.value=!1;let n=!1;for(const a of t.items||[]){const o=a?.task?.id;typeof o=="number"&&o>0&&(g.value[o]=a,He(a)&&(n=!0),_e(o)&&(n=!0))}n&&N()}catch(t){const n=(t instanceof Error?t.message:String(t||"")).toLowerCase();["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(o=>n.includes(o.toLowerCase()))&&E.value&&(se.value=!0,b.value="当前任务运行中,正在等待后端服务恢复...")}}function Je(){return is()}function ue(e=!1){if(T.value){if(!e)return;clearTimeout(T.value),T.value=null}const s=async()=>{if(T.value=null,ee.value){ue();return}const t=U();if(!t.length)return;ee.value=!0;let n=!1,a=!1;try{await oe(t),await Ae();for(const o of t)Ie(o)&&(he(o),n=!0,a=!0)}finally{ee.value=!1}a?await O():n&&N(),U().length>0&&ue()};e?s():T.value=window.setTimeout(s,Je())}function ie(e=!1){T.value&&!e||ue(e)}function Z(e){const s=e.taskId?g.value[e.taskId]?.task?.status:null;return s==="SUCCESS"?{className:"success",text:"已完成"}:s==="FAILED"?{className:"failed",text:"失败"}:s==="RUNNING"?{className:"running",text:"执行中"}:e.taskStatus==="SUCCESS"?{className:"success",text:"已完成"}:e.taskStatus==="FAILED"?{className:"failed",text:"失败"}:e.taskStatus==="RUNNING"?{className:"running",text:"执行中"}:e.success?{className:"success",text:"已完成"}:{className:"failed",text:"失败"}}function Se(){T.value&&(window.clearTimeout(T.value),T.value=null),ce()}async function Te(e){const s=G();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const n of e){const a=typeof n=="string"?n:n.absolutePath,o=typeof n=="string"?void 0:n.relativePath,r=await s.upload_file_to_java(a,o);if(!r?.success||!r.data)throw new Error(r?.error||r?.message||`上传失败:${a}`);t.push(r.data)}return t}async function Ge(){const e=G();if(!e?.select_brand_xlsx_files){p.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await e.select_brand_xlsx_files();if(!s?.length)return;A.value=s,j.value=await Te(s),p.success(`已选择 ${s.length} 个删除品牌文件`)}catch(s){p.error(s instanceof Error?s.message:"选择失败")}}async function je(){const e=G();if(!e?.select_brand_folder){p.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await e.select_brand_folder();if(!s)return;const t=await vs(s);if(!t.success||!t.items?.length){p.warning(t.error||"该文件夹下没有 xlsx 文件");return}A.value=t.items.map(n=>n.relativePath||n.absolutePath),j.value=await Te(t.items),p.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`)}catch(s){p.error(s instanceof Error?s.message:"选择失败")}}async function ze(){if(!j.value.length){p.warning("请先选择待处理文件");return}try{B.value=!0;const e=await ls({files:j.value.map(a=>({fileKey:a.fileKey,originalFilename:a.originalFilename,relativePath:a.relativePath}))}),s=me(e.items||[]),t=s.some(a=>a.matchStatus==="MATCHED"),n=s.some(a=>a.matchStatus&&a.matchStatus!=="MATCHED");b.value=t?"解析完成,可在左侧点击“推送到 Python 队列”开始串行处理":"解析完成,当前没有可推送的已匹配文件",S.value="",s.length&&s[0].taskId&&ne(s[0].taskId,s,b.value,S.value),N(),n?p.warning("部分文件尚未命中可用店铺索引,已保留状态信息,请等待后台刷新后重试。"):t?p.success("删除品牌解析完成,请在左侧推送到 Python 队列"):p.warning("当前没有可推送的已匹配文件,请先等待店铺索引刷新。"),await O()}catch(e){p.error(e instanceof Error?e.message:"执行失败")}finally{B.value=!1}}async function Ce(e){const s=e.taskId;if(!s){p.warning("未找到任务ID");return}const t=G(),n=rs(s),a=e.outputFilename||e.sourceFilename||`delete-brand_${s}.xlsx`;if(t?.save_file_from_url_new){const o=await t.save_file_from_url_new(n,a);o.success?p.success(`已保存:${o.path||a}`):o.error&&o.error!=="用户取消"&&p.error(o.error);return}}async function O(){try{const e=await os();q.value=me(e.items||[]),qe(q.value),N(),await oe(),ie(!0)}catch(e){const s=(e instanceof Error?e.message:String(e||"")).toLowerCase();["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(n=>s.includes(n.toLowerCase()))||console.error("loadHistory error:",e)}}function Ee(e){i.value.forEach(t=>{t.items=t.items.filter(n=>n.resultId!==e)});const s=i.value.length;i.value=i.value.filter(t=>t.items.length>0),i.value.length!==s&&typeof window<"u"&&window.localStorage.setItem($(),JSON.stringify(i.value)),q.value=q.value.filter(t=>t.resultId!==e),N(),U().length===0&&Se()}async function Fe(e){try{await us(e),Ee(e),await O(),p.success("已删除")}catch(s){const t=s instanceof Error?s.message:"删除失败";if(typeof t=="string"&&t.includes("记录不存在")){Ee(e),p.success("已删除");return}p.error(t)}}function Pe(e){const s=e.slice(0,5).map(n=>`${n.country}:${n.asin}${n.status?`(${n.status})`:""}`);return e.length-s.length>0?`${s.join("、")} 等 ${e.length} 条`:s.join("、")}function It(e,s){}function ce(){L.value&&(window.clearTimeout(L.value),L.value=null)}function Ve(e=3e3){ce(),L.value=window.setTimeout(()=>{L.value=null,Ae().catch(()=>{})},e)}function Qe(e){return e.includes("当前店铺正在执行中")}function Re(){for(const e of i.value)for(const s of e.items){const t=P(s);if(t==="已入队"||t==="处理中")return!0}return!1}function K(e){return e.resultId!=null?`result:${e.resultId}`:`task:${e.taskId||0}:${e.sourceFilename||""}`}function xe(e){return!!(e.taskId&&(e.matchStatus==="MATCHED"||e.matched))}function Ne(){return F.value.find(e=>!xe(e)||K(e)===D.value||x(e.taskId,e)?._completed?!1:P(e)==="未入队")}async function $e(e,s){if(s?.auto&&Re())return e.taskId,e.sourceFilename,{success:!1,retryable:!0};const t=G(),n=e.taskId;if(!n)return{success:!1,retryable:!1};const a=i.value.find(c=>c.taskId===n);if(!a)return{success:!1,retryable:!1};if(!t?.enqueue_json)return p.error("当前环境未启用 pywebview enqueue_json(浏览器环境不会推送)"),{success:!1,retryable:!1};const o={type:"delete-brand-run",ts:Date.now(),data:{taskId:n,items:[e]}};S.value=JSON.stringify(o,null,2);const r=await t.enqueue_json(o);let u="";if(r?.success){u=`已推送文件 ${e.sourceFilename},当前队列长度:${r.queue_size??"-"}`;const c=x(n,e);return c&&(c._pushed=!0,c._completed=!1),D.value=K(e),ne(n,a.items,u,S.value),ie(!0),b.value=u,{success:!0,retryable:!1}}else{const c=r?.error||"未知错误";if(u=`推送到 Python 队列失败:${c}`,b.value=u,ne(n,a.items,u,S.value),s?.auto&&Qe(c))return{success:!1,retryable:!0}}return b.value=u,{success:!1,retryable:!1}}async function Xe(){const e=Ne();if(!e){p.warning("当前没有可推送的已匹配文件");return}V.value=!0,E.value=!0,ce();const s=await $e(e);if(V.value=!1,!s.success){E.value=!1,D.value="";return}p.success("已开始按顺序推送到 Python 队列")}async function Ae(){if(!E.value||Q.value){E.value,Q.value;return}if(Re())return;const e=D.value;if(e){const t=F.value.find(n=>K(n)===e);if(t){const n=t.taskId,a=R(n);a&&(_e(n),P(t),void 0);const o=P(t);if(o==="已入队"||o==="处理中"){t.sourceFilename;return}if(a){const r=x(n,t);if(r&&!r._completed){t.sourceFilename,r._pushed,r._completed;return}}}}const s=Ne();if(!s){D.value="",E.value=!1;return}Q.value=!0;try{s.taskId,s.sourceFilename,K(s);const t=await $e(s,{auto:!0});if(!t.success){if(t.retryable){s.taskId,s.sourceFilename,Ve();return}s.taskId,s.sourceFilename,E.value=!1}}finally{Q.value=!1}}return Ze(()=>{Be();const e=U();e.length>0?oe(e).then(async()=>{let s=!1,t=!1;for(const n of e)Ie(n)&&(he(n),s=!0,t=!0);t?await O():s&&N(),ie(!0)}):N(),O().catch(()=>{})}),es(()=>{Se()}),(e,s)=>(d(),f("div",hs,[ss(ts,{active:"delete-brand"}),l("div",ps,[l("aside",_s,[s[2]||(s[2]=l("div",{class:"section-title"},"选择文件",-1)),l("div",ys,[s[0]||(s[0]=l("div",{class:"hint"},"上传删除品牌 Excel;无论是直接上传文件还是上传文件夹批量导入,都会按每个 Excel 文件名作为店铺名。",-1)),l("div",{class:"btns"},[l("button",{type:"button",class:"opt-btn",onClick:Ge},"选择 Excel 文件"),l("button",{type:"button",class:"opt-btn",onClick:je},"选择文件夹")]),l("div",gs,[A.value.length?(d(),f(H,{key:0},[(d(!0),f(H,null,fe(te.value,t=>(d(),f("span",{key:t},v(t),1))),128)),A.value.length>te.value.length?(d(),f("span",ms," 还有 "+v(A.value.length-te.value.length)+" 个文件未展开显示 ",1)):h("",!0)],64)):(d(),f("span",ks,"暂未选择删除品牌文件"))])]),s[3]||(s[3]=ns('
执行说明
',2)),l("div",ws,[l("button",{type:"button",class:"btn-run",disabled:B.value,onClick:ze},v(B.value?"解析中...":"开始解析"),9,Is),l("button",{type:"button",class:"btn-run btn-queue",disabled:V.value||!Ue.value.length,onClick:Xe},v(V.value?"推送中...":"推送到 Python 队列"),9,bs),l("span",Ss,v(B.value?"正在读取删除品牌数据,请稍候…":"解析后会在右侧展示按国家分组的去重结果"),1)]),b.value||S.value?(d(),f("div",Ts,[s[1]||(s[1]=l("div",{class:"section-title queue-debug-title"},"Python 队列推送结果",-1)),b.value?(d(),f("div",Cs,v(b.value),1)):h("",!0),S.value?(d(),f("pre",Es,v(S.value),1)):h("",!0)])):h("",!0)]),l("section",Fs,[s[12]||(s[12]=l("div",{class:"panel-header"},"删除品牌结果",-1)),l("div",Ps,[l("div",Rs,[l("div",xs,[s[4]||(s[4]=l("span",{class:"summary-label"},"已处理文件",-1)),l("strong",null,v(z.value.total),1)]),l("div",Ns,[s[5]||(s[5]=l("span",{class:"summary-label"},"成功结果",-1)),l("strong",null,v(z.value.successCount),1)]),l("div",$s,[s[6]||(s[6]=l("span",{class:"summary-label"},"失败文件",-1)),l("strong",null,v(z.value.failedCount),1)])]),l("div",As,[s[11]||(s[11]=l("div",{class:"result-list-header"},[l("span",null,"删除品牌结果列表")],-1)),Le.value?(d(),f(H,{key:1},[F.value.length?(d(),f("div",Ms,[s[8]||(s[8]=l("div",{class:"result-subsection-title"},"当前任务",-1)),l("ul",Bs,[(d(!0),f(H,null,fe(F.value,t=>(d(),f("li",{key:`current-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[l("div",qs,[l("span",{class:"id",title:t.sourceFilename},v(t.sourceFilename||"-"),9,Ls),l("div",Us,"店铺名:"+v(t.shopName||"-"),1),l("div",Os,"匹配结果:"+v(ke(t)),1),t.platform?(d(),f("div",Ks,"平台:"+v(t.platform),1)):h("",!0),P(t)?(d(),f("div",Hs,"队列状态:"+v(P(t)),1)):h("",!0),t.countryCount!==void 0&&t.matched?(d(),f("div",Js,"国家数:"+v(t.countryCount),1)):h("",!0),t.totalRows!==void 0&&t.matched?(d(),f("div",Gs,"去重后 "+v(t.totalRows)+" 条 ",1)):h("",!0),ge(t)?(d(),f("div",js,[l("div",zs,[s[7]||(s[7]=l("span",null,"任务进度",-1)),l("span",null,v(Y(t))+"%",1)]),l("div",Vs,[l("div",{class:"delete-brand-progress-bar-fill",style:De({width:`${Y(t)}%`})},null,4)]),l("div",Qs,v(we(t)),1)])):h("",!0),t.previewRows?.length?(d(),f("div",Xs,v(Pe(t.previewRows)),1)):h("",!0),W(t)?(d(),f("div",Ws,"错误信息:"+v(W(t)),1)):h("",!0)]),l("div",Ys,[l("span",{class:Me(["status",Z(t).className])},v(Z(t).text),3),be(t)?(d(),f("button",{key:0,type:"button",class:"download",onClick:n=>Ce(t)}," 下载 ",8,Zs)):h("",!0),t.resultId?(d(),f("button",{key:1,type:"button",class:"btn-delete",onClick:n=>Fe(t.resultId)}," 删除 ",8,et)):h("",!0)])]))),128))])])):h("",!0),X.value.length?(d(),f("div",st,[s[10]||(s[10]=l("div",{class:"result-subsection-title"},"历史记录",-1)),l("ul",tt,[(d(!0),f(H,null,fe(X.value,t=>(d(),f("li",{key:`history-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[l("div",nt,[l("span",{class:"id",title:t.sourceFilename},v(t.sourceFilename||"-"),9,at),l("div",lt,"店铺名:"+v(t.shopName||"-"),1),l("div",rt,"匹配结果:"+v(ke(t)),1),t.platform?(d(),f("div",ot,"平台:"+v(t.platform),1)):h("",!0),t.countryCount!==void 0&&t.matched?(d(),f("div",ut,"国家数:"+v(t.countryCount),1)):h("",!0),t.totalRows!==void 0&&t.matched?(d(),f("div",it,"去重后 "+v(t.totalRows)+" 条 ",1)):h("",!0),ge(t)?(d(),f("div",ct,[l("div",dt,[s[9]||(s[9]=l("span",null,"任务进度",-1)),l("span",null,v(Y(t))+"%",1)]),l("div",ft,[l("div",{class:"delete-brand-progress-bar-fill",style:De({width:`${Y(t)}%`})},null,4)]),l("div",vt,v(we(t)),1)])):h("",!0),t.previewRows?.length?(d(),f("div",ht,v(Pe(t.previewRows)),1)):h("",!0),W(t)?(d(),f("div",pt,"错误信息:"+v(W(t)),1)):h("",!0)]),l("div",_t,[l("span",{class:Me(["status",Z(t).className])},v(Z(t).text),3),be(t)?(d(),f("button",{key:0,type:"button",class:"download",onClick:n=>Ce(t)}," 下载 ",8,yt)):h("",!0),t.resultId?(d(),f("button",{key:1,type:"button",class:"btn-delete",onClick:n=>Fe(t.resultId)}," 删除 ",8,gt)):h("",!0)])]))),128))])])):h("",!0)],64)):(d(),f("div",Ds," 暂无删除品牌结果,完成解析后会在这里展示按国家分组的去重结果 "))])])])])]))}}),kt=cs(mt,[["__scopeId","data-v-64ee024e"]]);ds(kt).use(fs).mount("#app"); diff --git a/app/assets/split.js b/app/assets/split.js index ad4852d..5ee1e4c 100644 --- a/app/assets/split.js +++ b/app/assets/split.js @@ -1 +1 @@ -import{d as G,o as J,a,c as n,b as L,B as O,e,F as S,r as $,t as i,f as v,n as x,w as k,s as V,C as M,g as c,h as Q,i as F,E as r,D as W,G as X,m as Y,v as Z,H as ss,_ as es,p as ts,q as ls}from"./pywebview-CeWJDVeG.js";import{e as as}from"./brand-UU-ckLq6.js";const ns={class:"page-shell module-page"},os={class:"main-content"},is={class:"left-panel"},rs={class:"upload-zone"},us={class:"selected-files clean-placeholder split-selected-files"},cs={key:0,class:"more-line"},ds={key:1},ps={class:"option-group column-option-group"},vs={class:"column-toolbar"},fs={class:"column-count"},_s={class:"column-actions"},ms={key:0,class:"column-grid"},ys=["value"],gs={key:1,class:"empty-column-state"},hs={class:"option-group"},bs={class:"radio-item active"},ws={class:"desc"},ks={class:"option-group"},Cs={class:"option-group"},Ss={key:0,class:"split-input-card"},xs={key:1,class:"split-input-card"},Fs={class:"run-row"},Es=["disabled"],Ps={class:"loading-msg"},$s={class:"right-panel"},Bs={class:"task-list-wrap"},Rs={class:"clean-result-summary"},Is={class:"summary-card"},Us={class:"summary-card"},Vs={class:"summary-card"},Ms={class:"result-list-wrap"},Ts={key:0,class:"empty-tasks"},Ds={key:1,class:"task-list clean-result-list"},Hs={class:"left split-result-main"},Ns=["title"],js={key:0,class:"files"},As={key:1,class:"time"},Ks={key:2,class:"files"},zs={key:3,class:"files split-entry-list"},qs={key:4,class:"files"},Gs={class:"task-right split-result-actions"},Js=["onClick"],Ls=["onClick"],Os=G({__name:"BrandSplitTab",setup(Ws){const f=c([]),C=c(""),d=c([]),_=c([]),p=c([]),B=c(0),u=c("rows_per_file"),m=c(2e3),y=c(5),g=c(!1),h=c([]),b=c({total:0,successCount:0,failedCount:0,items:[]}),E=Q(()=>f.value.slice(0,8));function T(l){b.value={total:l.length,successCount:l.filter(s=>s.success).length,failedCount:l.filter(s=>!s.success).length,items:l}}async function R(l){const s=F();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const o of l){const U=typeof o=="string"?o:o.absolutePath,q=typeof o=="string"?void 0:o.relativePath,w=await s.upload_file_to_java(U,q);if(!w?.success||!w.data)throw new Error(w?.error||w?.message||`上传失败:${U}`);t.push(w.data)}return t}async function I(l){const s=await Y(l);_.value=s.headers||[],p.value=[...s.headers||[]],B.value=s.totalRows||0}async function D(l,s){f.value=l,C.value="",d.value=await R(l),d.value.length>0&&await I(d.value[0].fileKey),r.success(s)}async function H(){const l=F();if(!l?.select_brand_xlsx_files){r.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await l.select_brand_xlsx_files();if(!s?.length)return;await D(s,`已选择 ${s.length} 个待拆分文件`)}catch(s){r.error(s instanceof Error?s.message:"选择失败")}}async function N(){const l=F();if(!l?.select_brand_folder){r.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await l.select_brand_folder();if(!s)return;C.value=s.split(/[/\\]/).filter(Boolean).pop()||"";const t=await as(s);if(t.success&&t.items?.length){f.value=t.items.map(o=>o.relativePath),d.value=await R(t.items),d.value.length>0&&await I(d.value[0].fileKey),r.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`);return}r.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(s){r.error(s instanceof Error?s.message:"选择失败")}}async function j(){if(!d.value.length){r.warning("请先选择待拆分 Excel 文件或文件夹");return}if(!p.value.length){r.warning("请至少选择一列保留列");return}if(u.value==="rows_per_file"&&(!m.value||m.value<=0)){r.warning("请输入有效的每份条数");return}if(u.value==="parts"&&(!y.value||y.value<=0)){r.warning("请输入有效的拆分份数");return}try{g.value=!0;const l=await W({files:d.value.map(s=>({fileKey:s.fileKey,originalFilename:s.originalFilename,relativePath:s.relativePath})),selectedColumns:p.value,splitMode:u.value,rowsPerFile:u.value==="rows_per_file"&&m.value||void 0,parts:u.value==="parts"&&y.value||void 0,archiveName:d.value.some(s=>!!s.relativePath)&&C.value?C.value:void 0});b.value=l,h.value=l.items||[],await P(),r.success("数据拆分完成")}catch(l){r.error(l instanceof Error?l.message:"数据拆分失败")}finally{g.value=!1}}async function P(){try{const l=await X();h.value=l.items||[],T(h.value)}catch{}}async function A(l){try{await ss(l),await P(),r.success("已删除")}catch(s){r.error(s instanceof Error?s.message:"删除失败")}}function K(l){const s=l.slice(0,4).map(o=>o.rowCount!==void 0?`${o.filename}(${o.rowCount}条)`:o.filename);return l.length-s.length>0?`${s.join("、")} 等 ${l.length} 个文件`:s.join("、")}async function z(l){const s=F();if(!l.downloadUrl){r.warning("当前结果没有下载地址");return}const t=l.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}.zip`;if(s?.save_file_from_url_new){const o=await s.save_file_from_url_new(l.downloadUrl,t);o.success?r.success(`已保存:${o.path||t}`):o.error&&o.error!=="用户取消"&&r.error(o.error);return}}return J(()=>{P().catch(()=>{})}),(l,s)=>(a(),n("div",ns,[L(O,{active:"split"}),e("div",os,[e("aside",is,[s[14]||(s[14]=e("div",{class:"section-title"},"选择文件",-1)),e("div",rs,[s[7]||(s[7]=e("div",{class:"hint"},"选择需要拆分的 Excel 文件或文件夹,按规则拆成多个 Excel 文件。",-1)),e("div",{class:"btns"},[e("button",{type:"button",class:"opt-btn",onClick:H},"选择 Excel 文件"),e("button",{type:"button",class:"opt-btn",onClick:N},"选择文件夹")]),e("div",us,[f.value.length?(a(),n(S,{key:0},[(a(!0),n(S,null,$(E.value,t=>(a(),n("span",{key:t},i(t),1))),128)),f.value.length>E.value.length?(a(),n("span",cs," 还有 "+i(f.value.length-E.value.length)+" 个文件未展开显示 ",1)):v("",!0)],64)):(a(),n("span",ds,"暂未选择待拆分文件"))])]),s[15]||(s[15]=e("div",{class:"section-title"},"保留列设置",-1)),e("div",ps,[e("div",vs,[e("span",fs,"已选择 "+i(p.value.length)+" / "+i(_.value.length)+" 列",1),e("div",_s,[e("button",{type:"button",class:"opt-btn small",onClick:s[0]||(s[0]=t=>p.value=[..._.value])},"全选"),e("button",{type:"button",class:"opt-btn small",onClick:s[1]||(s[1]=t=>p.value=[])},"清空")])]),_.value.length?(a(),n("div",ms,[(a(!0),n(S,null,$(_.value,t=>(a(),n("label",{key:t,class:x(["column-item",{active:p.value.includes(t)}])},[k(e("input",{"onUpdate:modelValue":s[2]||(s[2]=o=>p.value=o),type:"checkbox",value:t},null,8,ys),[[Z,p.value]]),e("span",null,i(t),1)],2))),128))])):(a(),n("div",gs,"请选择 Excel 文件后读取表头并填充可保留列"))]),s[16]||(s[16]=e("div",{class:"section-title"},"总条数",-1)),e("div",hs,[e("label",bs,[s[9]||(s[9]=e("input",{type:"checkbox",checked:"",disabled:""},null,-1)),e("div",null,[s[8]||(s[8]=e("span",{class:"label"},"当前数据总条数",-1)),e("div",ws,i(B.value)+" 条(不含表头)",1)])])]),s[17]||(s[17]=e("div",{class:"section-title"},"拆分模式",-1)),e("div",ks,[e("label",{class:x(["radio-item",{active:u.value==="rows_per_file"}])},[k(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>u.value=t),type:"radio",value:"rows_per_file",name:"split-mode"},null,512),[[V,u.value]]),s[10]||(s[10]=e("div",null,[e("span",{class:"label"},"按每份条数"),e("div",{class:"desc"},"例如每份 2000 条,最后一份放剩余数据")],-1))],2),e("label",{class:x(["radio-item",{active:u.value==="parts"}])},[k(e("input",{"onUpdate:modelValue":s[4]||(s[4]=t=>u.value=t),type:"radio",value:"parts",name:"split-mode"},null,512),[[V,u.value]]),s[11]||(s[11]=e("div",null,[e("span",{class:"label"},"按份数平均拆分"),e("div",{class:"desc"},"例如拆 5 份,按总条数尽量平均分配")],-1))],2)]),s[18]||(s[18]=e("div",{class:"section-title"},"拆分参数",-1)),e("div",Cs,[u.value==="rows_per_file"?(a(),n("label",Ss,[s[12]||(s[12]=e("span",{class:"label"},"每份条数",-1)),k(e("input",{"onUpdate:modelValue":s[5]||(s[5]=t=>m.value=t),class:"split-number-input",type:"number",min:"1",placeholder:"例如 2000"},null,512),[[M,m.value,void 0,{number:!0}]])])):(a(),n("label",xs,[s[13]||(s[13]=e("span",{class:"label"},"拆分份数",-1)),k(e("input",{"onUpdate:modelValue":s[6]||(s[6]=t=>y.value=t),class:"split-number-input",type:"number",min:"1",placeholder:"例如 5"},null,512),[[M,y.value,void 0,{number:!0}]])]))]),e("div",Fs,[e("button",{type:"button",class:"btn-run",disabled:g.value,onClick:j},i(g.value?"拆分中...":"开始拆分"),9,Es),e("span",Ps,i(g.value?"正在拆分并上传结果,请稍候…":"选择文件、保留列和拆分规则后即可执行拆分,结果会显示在右侧供下载"),1)])]),e("section",$s,[s[23]||(s[23]=e("div",{class:"panel-header"},"拆分结果",-1)),e("div",Bs,[e("div",Rs,[e("div",Is,[s[19]||(s[19]=e("span",{class:"summary-label"},"已处理文件",-1)),e("strong",null,i(b.value.total),1)]),e("div",Us,[s[20]||(s[20]=e("span",{class:"summary-label"},"成功结果",-1)),e("strong",null,i(b.value.successCount),1)]),e("div",Vs,[s[21]||(s[21]=e("span",{class:"summary-label"},"失败文件",-1)),e("strong",null,i(b.value.failedCount),1)])]),e("div",Ms,[s[22]||(s[22]=e("div",{class:"result-list-header"},[e("span",null,"拆分结果压缩包列表")],-1)),h.value.length===0?(a(),n("div",Ts," 暂无拆分结果,完成数据拆分后会在这里展示压缩包文件 ")):(a(),n("ul",Ds,[(a(!0),n(S,null,$(h.value,t=>(a(),n("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}-${t.rowCount||0}`,class:"task-item split-result-item"},[e("div",Hs,[e("span",{class:"id",title:t.sourceFilename},i(t.sourceFilename||"-"),9,Ns),t.outputFilename?(a(),n("div",js,"压缩包文件:"+i(t.outputFilename),1)):v("",!0),t.rowCount!==void 0?(a(),n("div",As,"压缩包共包含 "+i(t.rowCount)+" 条数据",1)):v("",!0),t.entryCount&&t.entryCount>0?(a(),n("div",Ks,"压缩包内共 "+i(t.entryCount)+" 个拆分文件 ",1)):v("",!0),t.entries&&t.entries.length?(a(),n("div",zs," 压缩包内容:"+i(K(t.entries)),1)):v("",!0),t.error?(a(),n("div",qs,"错误信息:"+i(t.error),1)):v("",!0)]),e("div",Gs,[e("span",{class:x(["status",t.success?"success":"failed"])},i(t.success?"已完成":"失败"),3),t.success&&t.downloadUrl?(a(),n("button",{key:0,type:"button",class:"download",onClick:o=>z(t)}," 下载压缩包 ",8,Js)):v("",!0),t.resultId?(a(),n("button",{key:1,type:"button",class:"btn-delete",onClick:o=>A(t.resultId)}," 删除 ",8,Ls)):v("",!0)])]))),128))]))])])])])]))}}),Qs=es(Os,[["__scopeId","data-v-c5a98d6b"]]);ts(Qs).use(ls).mount("#app"); +import{d as G,o as J,a,c as n,b as L,B as O,e,F as S,r as $,t as i,f as v,n as x,w as k,s as V,C as M,g as c,h as Q,i as F,E as r,D as W,G as X,m as Y,v as Z,H as ss,_ as es,p as ts,q as ls}from"./pywebview-Bt854mYs.js";import{e as as}from"./brand-5-W0Wonr.js";const ns={class:"page-shell module-page"},os={class:"main-content"},is={class:"left-panel"},rs={class:"upload-zone"},us={class:"selected-files clean-placeholder split-selected-files"},cs={key:0,class:"more-line"},ds={key:1},ps={class:"option-group column-option-group"},vs={class:"column-toolbar"},fs={class:"column-count"},_s={class:"column-actions"},ms={key:0,class:"column-grid"},ys=["value"],gs={key:1,class:"empty-column-state"},hs={class:"option-group"},bs={class:"radio-item active"},ws={class:"desc"},ks={class:"option-group"},Cs={class:"option-group"},Ss={key:0,class:"split-input-card"},xs={key:1,class:"split-input-card"},Fs={class:"run-row"},Es=["disabled"],Ps={class:"loading-msg"},$s={class:"right-panel"},Bs={class:"task-list-wrap"},Rs={class:"clean-result-summary"},Is={class:"summary-card"},Us={class:"summary-card"},Vs={class:"summary-card"},Ms={class:"result-list-wrap"},Ts={key:0,class:"empty-tasks"},Ds={key:1,class:"task-list clean-result-list"},Hs={class:"left split-result-main"},Ns=["title"],js={key:0,class:"files"},As={key:1,class:"time"},Ks={key:2,class:"files"},zs={key:3,class:"files split-entry-list"},qs={key:4,class:"files"},Gs={class:"task-right split-result-actions"},Js=["onClick"],Ls=["onClick"],Os=G({__name:"BrandSplitTab",setup(Ws){const f=c([]),C=c(""),d=c([]),_=c([]),p=c([]),B=c(0),u=c("rows_per_file"),m=c(2e3),y=c(5),g=c(!1),h=c([]),b=c({total:0,successCount:0,failedCount:0,items:[]}),E=Q(()=>f.value.slice(0,8));function T(l){b.value={total:l.length,successCount:l.filter(s=>s.success).length,failedCount:l.filter(s=>!s.success).length,items:l}}async function R(l){const s=F();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const o of l){const U=typeof o=="string"?o:o.absolutePath,q=typeof o=="string"?void 0:o.relativePath,w=await s.upload_file_to_java(U,q);if(!w?.success||!w.data)throw new Error(w?.error||w?.message||`上传失败:${U}`);t.push(w.data)}return t}async function I(l){const s=await Y(l);_.value=s.headers||[],p.value=[...s.headers||[]],B.value=s.totalRows||0}async function D(l,s){f.value=l,C.value="",d.value=await R(l),d.value.length>0&&await I(d.value[0].fileKey),r.success(s)}async function H(){const l=F();if(!l?.select_brand_xlsx_files){r.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await l.select_brand_xlsx_files();if(!s?.length)return;await D(s,`已选择 ${s.length} 个待拆分文件`)}catch(s){r.error(s instanceof Error?s.message:"选择失败")}}async function N(){const l=F();if(!l?.select_brand_folder){r.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await l.select_brand_folder();if(!s)return;C.value=s.split(/[/\\]/).filter(Boolean).pop()||"";const t=await as(s);if(t.success&&t.items?.length){f.value=t.items.map(o=>o.relativePath),d.value=await R(t.items),d.value.length>0&&await I(d.value[0].fileKey),r.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`);return}r.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(s){r.error(s instanceof Error?s.message:"选择失败")}}async function j(){if(!d.value.length){r.warning("请先选择待拆分 Excel 文件或文件夹");return}if(!p.value.length){r.warning("请至少选择一列保留列");return}if(u.value==="rows_per_file"&&(!m.value||m.value<=0)){r.warning("请输入有效的每份条数");return}if(u.value==="parts"&&(!y.value||y.value<=0)){r.warning("请输入有效的拆分份数");return}try{g.value=!0;const l=await W({files:d.value.map(s=>({fileKey:s.fileKey,originalFilename:s.originalFilename,relativePath:s.relativePath})),selectedColumns:p.value,splitMode:u.value,rowsPerFile:u.value==="rows_per_file"&&m.value||void 0,parts:u.value==="parts"&&y.value||void 0,archiveName:d.value.some(s=>!!s.relativePath)&&C.value?C.value:void 0});b.value=l,h.value=l.items||[],await P(),r.success("数据拆分完成")}catch(l){r.error(l instanceof Error?l.message:"数据拆分失败")}finally{g.value=!1}}async function P(){try{const l=await X();h.value=l.items||[],T(h.value)}catch{}}async function A(l){try{await ss(l),await P(),r.success("已删除")}catch(s){r.error(s instanceof Error?s.message:"删除失败")}}function K(l){const s=l.slice(0,4).map(o=>o.rowCount!==void 0?`${o.filename}(${o.rowCount}条)`:o.filename);return l.length-s.length>0?`${s.join("、")} 等 ${l.length} 个文件`:s.join("、")}async function z(l){const s=F();if(!l.downloadUrl){r.warning("当前结果没有下载地址");return}const t=l.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}.zip`;if(s?.save_file_from_url_new){const o=await s.save_file_from_url_new(l.downloadUrl,t);o.success?r.success(`已保存:${o.path||t}`):o.error&&o.error!=="用户取消"&&r.error(o.error);return}}return J(()=>{P().catch(()=>{})}),(l,s)=>(a(),n("div",ns,[L(O,{active:"split"}),e("div",os,[e("aside",is,[s[14]||(s[14]=e("div",{class:"section-title"},"选择文件",-1)),e("div",rs,[s[7]||(s[7]=e("div",{class:"hint"},"选择需要拆分的 Excel 文件或文件夹,按规则拆成多个 Excel 文件。",-1)),e("div",{class:"btns"},[e("button",{type:"button",class:"opt-btn",onClick:H},"选择 Excel 文件"),e("button",{type:"button",class:"opt-btn",onClick:N},"选择文件夹")]),e("div",us,[f.value.length?(a(),n(S,{key:0},[(a(!0),n(S,null,$(E.value,t=>(a(),n("span",{key:t},i(t),1))),128)),f.value.length>E.value.length?(a(),n("span",cs," 还有 "+i(f.value.length-E.value.length)+" 个文件未展开显示 ",1)):v("",!0)],64)):(a(),n("span",ds,"暂未选择待拆分文件"))])]),s[15]||(s[15]=e("div",{class:"section-title"},"保留列设置",-1)),e("div",ps,[e("div",vs,[e("span",fs,"已选择 "+i(p.value.length)+" / "+i(_.value.length)+" 列",1),e("div",_s,[e("button",{type:"button",class:"opt-btn small",onClick:s[0]||(s[0]=t=>p.value=[..._.value])},"全选"),e("button",{type:"button",class:"opt-btn small",onClick:s[1]||(s[1]=t=>p.value=[])},"清空")])]),_.value.length?(a(),n("div",ms,[(a(!0),n(S,null,$(_.value,t=>(a(),n("label",{key:t,class:x(["column-item",{active:p.value.includes(t)}])},[k(e("input",{"onUpdate:modelValue":s[2]||(s[2]=o=>p.value=o),type:"checkbox",value:t},null,8,ys),[[Z,p.value]]),e("span",null,i(t),1)],2))),128))])):(a(),n("div",gs,"请选择 Excel 文件后读取表头并填充可保留列"))]),s[16]||(s[16]=e("div",{class:"section-title"},"总条数",-1)),e("div",hs,[e("label",bs,[s[9]||(s[9]=e("input",{type:"checkbox",checked:"",disabled:""},null,-1)),e("div",null,[s[8]||(s[8]=e("span",{class:"label"},"当前数据总条数",-1)),e("div",ws,i(B.value)+" 条(不含表头)",1)])])]),s[17]||(s[17]=e("div",{class:"section-title"},"拆分模式",-1)),e("div",ks,[e("label",{class:x(["radio-item",{active:u.value==="rows_per_file"}])},[k(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>u.value=t),type:"radio",value:"rows_per_file",name:"split-mode"},null,512),[[V,u.value]]),s[10]||(s[10]=e("div",null,[e("span",{class:"label"},"按每份条数"),e("div",{class:"desc"},"例如每份 2000 条,最后一份放剩余数据")],-1))],2),e("label",{class:x(["radio-item",{active:u.value==="parts"}])},[k(e("input",{"onUpdate:modelValue":s[4]||(s[4]=t=>u.value=t),type:"radio",value:"parts",name:"split-mode"},null,512),[[V,u.value]]),s[11]||(s[11]=e("div",null,[e("span",{class:"label"},"按份数平均拆分"),e("div",{class:"desc"},"例如拆 5 份,按总条数尽量平均分配")],-1))],2)]),s[18]||(s[18]=e("div",{class:"section-title"},"拆分参数",-1)),e("div",Cs,[u.value==="rows_per_file"?(a(),n("label",Ss,[s[12]||(s[12]=e("span",{class:"label"},"每份条数",-1)),k(e("input",{"onUpdate:modelValue":s[5]||(s[5]=t=>m.value=t),class:"split-number-input",type:"number",min:"1",placeholder:"例如 2000"},null,512),[[M,m.value,void 0,{number:!0}]])])):(a(),n("label",xs,[s[13]||(s[13]=e("span",{class:"label"},"拆分份数",-1)),k(e("input",{"onUpdate:modelValue":s[6]||(s[6]=t=>y.value=t),class:"split-number-input",type:"number",min:"1",placeholder:"例如 5"},null,512),[[M,y.value,void 0,{number:!0}]])]))]),e("div",Fs,[e("button",{type:"button",class:"btn-run",disabled:g.value,onClick:j},i(g.value?"拆分中...":"开始拆分"),9,Es),e("span",Ps,i(g.value?"正在拆分并上传结果,请稍候…":"选择文件、保留列和拆分规则后即可执行拆分,结果会显示在右侧供下载"),1)])]),e("section",$s,[s[23]||(s[23]=e("div",{class:"panel-header"},"拆分结果",-1)),e("div",Bs,[e("div",Rs,[e("div",Is,[s[19]||(s[19]=e("span",{class:"summary-label"},"已处理文件",-1)),e("strong",null,i(b.value.total),1)]),e("div",Us,[s[20]||(s[20]=e("span",{class:"summary-label"},"成功结果",-1)),e("strong",null,i(b.value.successCount),1)]),e("div",Vs,[s[21]||(s[21]=e("span",{class:"summary-label"},"失败文件",-1)),e("strong",null,i(b.value.failedCount),1)])]),e("div",Ms,[s[22]||(s[22]=e("div",{class:"result-list-header"},[e("span",null,"拆分结果压缩包列表")],-1)),h.value.length===0?(a(),n("div",Ts," 暂无拆分结果,完成数据拆分后会在这里展示压缩包文件 ")):(a(),n("ul",Ds,[(a(!0),n(S,null,$(h.value,t=>(a(),n("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}-${t.rowCount||0}`,class:"task-item split-result-item"},[e("div",Hs,[e("span",{class:"id",title:t.sourceFilename},i(t.sourceFilename||"-"),9,Ns),t.outputFilename?(a(),n("div",js,"压缩包文件:"+i(t.outputFilename),1)):v("",!0),t.rowCount!==void 0?(a(),n("div",As,"压缩包共包含 "+i(t.rowCount)+" 条数据",1)):v("",!0),t.entryCount&&t.entryCount>0?(a(),n("div",Ks,"压缩包内共 "+i(t.entryCount)+" 个拆分文件 ",1)):v("",!0),t.entries&&t.entries.length?(a(),n("div",zs," 压缩包内容:"+i(K(t.entries)),1)):v("",!0),t.error?(a(),n("div",qs,"错误信息:"+i(t.error),1)):v("",!0)]),e("div",Gs,[e("span",{class:x(["status",t.success?"success":"failed"])},i(t.success?"已完成":"失败"),3),t.success&&t.downloadUrl?(a(),n("button",{key:0,type:"button",class:"download",onClick:o=>z(t)}," 下载压缩包 ",8,Js)):v("",!0),t.resultId?(a(),n("button",{key:1,type:"button",class:"btn-delete",onClick:o=>A(t.resultId)}," 删除 ",8,Ls)):v("",!0)])]))),128))]))])])])])]))}}),Qs=es(Os,[["__scopeId","data-v-c5a98d6b"]]);ts(Qs).use(ls).mount("#app"); diff --git a/app/new_web_source/convert.html b/app/new_web_source/convert.html index 7e695d2..c688be2 100644 --- a/app/new_web_source/convert.html +++ b/app/new_web_source/convert.html @@ -5,9 +5,9 @@ 格式转换 - 数富AI - - - + + + diff --git a/app/new_web_source/dedupe.html b/app/new_web_source/dedupe.html index 9a875cb..f6b500a 100644 --- a/app/new_web_source/dedupe.html +++ b/app/new_web_source/dedupe.html @@ -5,9 +5,9 @@ 数据去重 - 数富AI - - - + + + diff --git a/app/new_web_source/delete-brand.html b/app/new_web_source/delete-brand.html index 3ce8fa8..c4f8367 100644 --- a/app/new_web_source/delete-brand.html +++ b/app/new_web_source/delete-brand.html @@ -5,9 +5,9 @@ 删除品牌 - 数富AI - - - + + + diff --git a/app/new_web_source/split.html b/app/new_web_source/split.html index 516fa0a..94801d0 100644 --- a/app/new_web_source/split.html +++ b/app/new_web_source/split.html @@ -5,9 +5,9 @@ 数据拆分 - 数富AI - - - + + + diff --git a/app/web_source/brand.html b/app/web_source/brand.html index 5f96d31..6e0e5db 100644 --- a/app/web_source/brand.html +++ b/app/web_source/brand.html @@ -401,6 +401,7 @@ 采集数据 变体分析 + 外观专利检测 数据去重 数据拆分 格式转换 @@ -413,7 +414,7 @@ 商品风险解决 定时匹配 跟价 - 巡店删除 + 查询ASIN 取款 店铺状态查询