From 21b6b5b2702b3b154acd20b47598eb04ca7dd223 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: Sat, 11 Apr 2026 23:00:55 +0800 Subject: [PATCH] modified: app/amazon/__pycache__/approve.cpython-39.pyc modified: app/amazon/__pycache__/del_brand.cpython-39.pyc modified: app/amazon/__pycache__/main.cpython-39.pyc modified: app/amazon/__pycache__/match_action.cpython-39.pyc modified: app/amazon/__pycache__/tool.cpython-39.pyc modified: app/amazon/approve.py modified: app/amazon/del_brand.py modified: app/amazon/main.py modified: app/amazon/match_action.py modified: app/amazon/tool.py modified: app/assets/delete-brand.js modified: app/new_web_source/delete-brand.html --- app/amazon/__pycache__/approve.cpython-39.pyc | Bin 26270 -> 26738 bytes .../__pycache__/del_brand.cpython-39.pyc | Bin 17460 -> 17677 bytes app/amazon/__pycache__/main.cpython-39.pyc | Bin 16993 -> 17469 bytes .../__pycache__/match_action.cpython-39.pyc | Bin 16804 -> 18698 bytes app/amazon/__pycache__/tool.cpython-39.pyc | Bin 2926 -> 3949 bytes app/amazon/approve.py | 51 +++++++++++------- app/amazon/del_brand.py | 19 ++++--- app/amazon/main.py | 22 ++++++-- app/amazon/match_action.py | 37 ++++++++++--- app/amazon/tool.py | 39 ++++++++++++++ app/assets/delete-brand.js | 2 +- app/new_web_source/delete-brand.html | 2 +- 12 files changed, 135 insertions(+), 37 deletions(-) diff --git a/app/amazon/__pycache__/approve.cpython-39.pyc b/app/amazon/__pycache__/approve.cpython-39.pyc index fb67c0155ef6ffc129729ffc47d9af3ee5449551..694a2d5cee1d64f680bb9ed8b176ebd347fd507a 100644 GIT binary patch delta 6032 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 delta 5580 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 diff --git a/app/amazon/__pycache__/del_brand.cpython-39.pyc b/app/amazon/__pycache__/del_brand.cpython-39.pyc index 7f3c49bad65cfdd0dda0e2641ebb0887112ebb76..1e620db2ce747d939e99c0319aadb7bbc4bd21e7 100644 GIT binary patch delta 723 zcmZuu&ubGw6rQ&~lFeqbO^Qk?QZZDUK(HwJ>5qoi5Tpk$u?P(wqT?Z3SnFg0ZQa;I z1WP5DItc1%bMq?kCZ0U$Ur+)bMLc;CZx-JqsTWW{mJ=T+^Z|%R9K}%`jVe^7T34Bz=v1cx8tf`<-~kUhK#g^cm3fec zI+#VxDxqqXq{8BL=FxGsf;GR-B2?HD#8w4CoXpOh@fH@E8+EsK_rA;P4Y!%(_cnPl zl}>zn_5SOJ7m1X(n!OND8EhFd*fj|!B_C~^UTX*N(xjvX>_A3-xKC(!U1bN{qL!T1NNSKqjs$p`|IdR! zZV_r%36JV>M6^8j2bpN6Jpcdz delta 503 zcmaJ-&r2IY82#St><`z?A|g^y6iS4qdZ?0^C`dp>u%|*OVxfnYIV2H+UDtzgqe#?> z5>&o_VB^tSN$IKoLywjAR_ei<^w3*NC$f0((1H2pz4v{*H#4ncd_02xCY5qYudDV| z<$Cpl|0+8*p=m@_szN~tWwb;Cp@`6gl4~+}5*o^E0;H@GDZ4}&hd*U^L_N*Rxip{V zo|#J-84U8*+;i*B+v4%*;_h#4TmSsP*ocf+Ter1c(veA|jAU%IDbZzY-eV{;nK2`? zDyx=ema})2D|=8sBmF@cCk< uh;#liGYPLVF#AWq?ex#p1kQM`_!dK*pT&KFNv_Oq!|q(q8v@{)#q>XFHF*dC diff --git a/app/amazon/__pycache__/main.cpython-39.pyc b/app/amazon/__pycache__/main.cpython-39.pyc index 7e85b187afbc2b7090094c38afc93fc0e785abd3..a10a71e7886c2b513db55352c45091b8b4c2110a 100644 GIT binary patch delta 4549 zcmbtXdvKK1760zH?`JlT&2y71AqgyykPwkbVgN+}MSNm#tFG&QUy{vZH@V-pK+VTMWb;@c; z>5BJ%pH)Kf1+_UVhy-`Jt#QXZ&wz3uW zkG#ua7p+7vBlr<~tkBU)EG{r^tqhR_7S;x51Vz0W(EO88Iql zoc%N&krgGRhLs+=p8dmBzK}a(0}9`WaI;jp4(24b+PxZNCfpAZM z*=8B{04!xJ=<`riq7Sl93M=O|6`i!7xr&tPC<^NYh!_B_{}lq^fe*Sw zd7qstdf6sEVNN-SIq}1wGg+p3j<>sk*Z4ssis6odO(Q+&66g{TrC$4zh&0p zwff<}Vb?&7q)oE{hflLfMLh;ip`yiH(M39MJEVaTao~Kckjq)D*-#nDhDxwVNp31I zYS2fLJ!x$hVrz|p>KzdWj}Rf5M}(nTzHf<!*xX4%gJOabH@{ z$L+#=z5vfpwF^Vbz;*-uC6{*#MrTw+pFkYTQ)vhgchgFo0-aiU0E~myX_a)lZkppAy3iX4KRlqiESl%dH}7qTO-UOT&c>eW40Prs9W_aqdfuP?vE z{#ag}N-WTsrjGnHd-R3ur5CTUOW6Z&OkLPB_1=l>nK7L;5dg0LWXYcU@zh(de0}*) zmL1MsIx%_j;^g5sSNnPOOgLf7egjieU*1C%6WQyERBZvrkRz(WCg^Y=YW1TWBXYW@Q++$F~PgAVGLAw-> zgnHv)NtQD9m@G>$=#0iFmR_2V8;z>GQ_UE=m3WL6;1-k4p{Hv0Rpp}1Gr2nGi1fz6 zp^*Bi94OQi_e=(+-6+pSWhK$8V*c(yaZW7M;n-j(7VeYjR`!%X(8LQ}0=ccg-5-xB za?k*s1$Rc!#T5uCi3nC;z1UW;H~jvRIVHCPB)ktFyTuBZ~} z66RQ3*A{}AK<=#gMv#vOSwTt#$XKY{0dDG|J8^0dVLCY57q>kv0!YL{aIi5^6l8zGp>m=!rpBV9DY za+<0`Rmk>Vy9b%kIgrVqS&zmfc_&3(dAO(^9$YpnJ&91SLbtKwO)CrLgylKlIKw_| z`i*zSKK%tuU;dxp5)wCXbMgMtXAta)#enw zh%L~xa_8_Hy%rbolG0NM`t=1W;L>mDyow>`ocqGB6xZl9uFls5KPwmnVG&!^JYeS6 z?lgO|xg1{chs{-{jY-qcFWBFj+fu4Ya%<*pGw<8X-4-bael?9iMHD6I?5-DRY@Vdt zhp~!^QXcSIcmtG=&68%*jFO4BIlt%Y1)51R6$#KRm^CAychtl?MeDdtDnu&gIJuJ2Hj@?Va_oQYdP^8-`anBtqFiBLs^F3XGeG z#3vd_jtGPqKH@*k7CUjW&s$fKPF8aJZ)^F($HOw_o*iM@sm#rum{bliZ`;XgA5i+^ z!G>fGU&e?(yiT!SwN;T?_LsJ%R1GrSHM3_EQt$=@YD8Fva3{iMfQ%s;Q)veda}Y3P zQ%n%lgzzi^+NY!8DZ%6&DU-{Em-+xx`}wG*qW9$n@ zV`HpxU5W2Jj;)~(&V)h%zaC~T;L&yx0U=Gig$F7 delta 4155 zcmbtXZEO_B8Q$6ZKHr_s_W2VVpUoM2{e{6XA>bGY;hPWy4JOx+^KrZ2!}gs$y9YMi z;~eY&Ap{HqjUsB-rlf@k1*?t_RY9uS{%MQUMwL)>|0?Am{HWTh;!oQoecxGQ8`ns! zYHOdHoq6W{n0e=YXYZXRe;Ov9u-okv;P2wZ7tvhxf~S<+y-@dI?PfuC$j)Iwb`FWb z5;;qD4GY0VN~!Gb66qaf(U3p{nd}iH&xL>edCDzb7fA)XZEhvrslS`Il14v>q*Vw@ z0n!dF+M}pixTlv^U?+!495Hpr4^>PZw(b*28T*y}Oz}(5`|#Yy4=>%$oSw{_9)JAN zwG4ab(R*jvn4`+QcJ3$(dyCjL$Ggi>oJ4|VIUZ9aF)cPWrOCnhnw+iOQB{k?dwSb; zv!L_$`3*3OmLXUX79*6fwya*_XScH23g%gA0sE;|$4sscvT;gwjggL4n6gu{Qk0Yy zqjK8SOXCqmRYO`>?V_(>w?m`hh;kqt=}J2f#%WJj3n~2($wd7yN;e{GLU>jiMMuNz zfM+%68ujcZS<8^rgs_GEBfFU_VvXM5D~1IQnu7zm2;8f!*jj|J4FL_I+YxpENVYk; zUt_=ZRu?a1!Fr&^rkpuulWQe3chV9RP|ZqwdzZJN7?HjRKS8tF8UK%Mb+jH*VoHB6 zZTkpkt!5LxFG(RgnO{z7*pKro$#>Xq@&g5EKHUe9wy9dYw^xxRLU%J$L8osw_F5E5 z<5bF~sE{_WR6&_l!e%YIT2Q}?`?UezXPtA*ac(Edu;E^WqB4D*eO*w#psTn@L#(Ax z4IDyY3P8jJ@bu3I4KF;XO5Mrs7hZLc{g;wiBjnghcC@G`wK7(q3*$sC)*V-bQBihG zh;TlfNxNu4g9Qwy z4*aA;cL3uP-60otnRpAe7L{_5Wd^w&j^>Ei_td1t>~Fqav;eY+in90yc#&Qv-H^O|5(bOatGaHmQHMqPbSsuTG^5OLZrO~@WcY(e|U33qCU24@fLP#aX_RkY-{;>3&j+| zz9?T~!8Edo75Wd7{p`5^jfR5hqygQu13^SEvIn-X?4>O<96O}YMHef4#m<2d9-Y%riYz6IRRW)nLN~Y9=tvq}8vimh>s#<`R_Neg$jVPO< z-3s?}7f!`(p*;YJa@Odt6lo3nq14c}A9|#mIa?G)UI#)SK-#2*52S5WIS4D+NmcCE z5R8=1oV9IRBKYn=@=VzctI?R0XKcyy7X#<%~U2R)8bQ|#Bxbz~R&YjXvOvfLN;uHiMd1IKU&jElqxYz-mI-va1M zTU8}YBb_wNe)K{h@uzs&*wp-74M7mbSF` z=552fz&Oj|Eq~0P@y`hT>8NjC84@>hcQHU|3V}x@!PX!`J3=7>t{Odq@BzX(g!2d^ z2=BA6SM5k)$nS&;6u)JKv7fIRMj>SgMtnj`avNc|pkc_I7au%?265mL!a_H)VF4~B zMeKJk^#ypCA@P}eiXA$#;Nka_4%V@{($bo=9J|9#t!_){*27lW1K0OqC<&sRJzJsh z#vpt5U>OnR9OUsEKrY?@bc=45ExgX(=i_<0MYa?QP%W*x8PGRs!IGxg#_e)Gwqh>M zE07Cue!I|D3Z>35k|G29pt#uJvLSOqk>=EG)0YiSomB-ln^l}s{J$!LtBN;iJ8tVM zHGc7`g6%zmD3!3!*Gx9xsY?_AWF|+yx^+2oW$eqlCJOSe5(>IWu2Woc{I(J(!v&QFdVK+xHPwU-0@lYyU=a-8(+ z=}nvQ&VQPnUsp*2?5FFRQ%jJ9!E2na&DesF7pNHlKZ)piglzz6Q#7VgEQT~20W&hi zd_XM-!wBdd?LZhsm{rePmDraD;D$%77ldVk9sIZF#l^Mao zC4a~YH%tW$i;zdh5Ek%0ZEx*~%ZYBKjQ~Rp0NBA(JE-sxFA2Z{Dovi0@buqm_t?q5 E0j_n+mH+?% diff --git a/app/amazon/__pycache__/match_action.cpython-39.pyc b/app/amazon/__pycache__/match_action.cpython-39.pyc index a9709a9254dc99927db160298f3cae76456ab039..cfa3167a941aae7a852edd94c76aa6b5098d1715 100644 GIT binary patch delta 7316 zcmbtZeQ+Dcb-z6v4u?;IAP9orAVo<8MTwM5Nw!2`*Rf-^I?Nt-xs>!!&yZKqACk51dPooQ#H zw4J`U2YyJVGo2|hc-VXQcK7YueZTkK^71r!?(-y&^!q&m{QdAZt@N#_vwY~aifhwwJ+L5S&XE*i0vu9dN1l4Nl9T#T^W7J3eG(f8^I1(WmOw`co zL|FCG&@>@}TBX8oqE@Y)ji@zclBk1LR1HI`9$F1$fe5rF(Wo}j@HE*i96pd}E|j8b z?O2Q2NNZ1%MC(BinIT8J4+=*=lms<4L#8^3kZ2=9p+#+1+xRrKW2XEA&E7b+y_$O{g#~p~`AIjoAHW*OUdAw&jqRSexhsex15D{Hj2sYUiuM zMG1vq@=vJk=6N!*O0=rA(cJN&Y)(%Pr&CEioy%JO5mg@o_T*4HJDi)V7H^28Y3>)& zkHqEx*p^ixAwX_9fb4lgWI^Qk&3|$oCBC`eQk-N*HE=9R&8V8?$f#LXgU>Ds3|*y` zq^BoT%c*5lb&`d!bC|zZv&kbFm9mI=$-R|CP0KyvZNk@_G|&B-=QfG7A%p9H+U#NN z_}pP0^2K-ItoC>~AL|5SxgR`{QYUd?tQ(o@fy5mwitWuPKvaA9${gSI{i}m?nBNLE zH}aWcD7d)p%5troR`jPBFasbJaLG2YI&kF>Xp`rIEL=u&1Pp{(P{1mY6_*39%5Wd{Bfmm)likhCBm|Wh?oNm}vi(Bf0?=JXi4RF?H#KL*= zuNtKy`7=8dI8JD7a=xY8X z(lygyv%dVw}<6&yl8m^zz~1l>0yPHiDV z5s<$y2y6Cd{KYD+LMKi_<9fgdpd~L#vw|@7Q`4$^9cgJ>;ljbwA4l-(fDK^}f29bEsazFsGq$9aphGlU$#7;|2 z<+8)+5r#2`yDl5YR>s`X*8V7m&PPzpq3O)>4CmNHQXf)Jq!2byE{9|iC0u$^8;3

w}|2sMAp3WXs@?EjUQA1FaCgV71Tf(Q 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 delta 5270 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 ADF6Tf diff --git a/app/amazon/__pycache__/tool.cpython-39.pyc b/app/amazon/__pycache__/tool.cpython-39.pyc index c74884ac75fc090d7b26aefbd2ac4c9a868b6d67..08dd8590af1e5cee96d4d65de2c5eef675565bde 100644 GIT binary patch delta 1265 zcmZ`&-*4MQ9FOh9aowcjhXg8&>9mK@bd8;~O`4T#8X{ayJ)pt$Y+CKN} z46ssV6KIprwr(m+NbAHZm>5W7op^z563_e#C-Jr{sSxnO1A-UM={owto$mYV?)%aA z*Zuy=Z-@F|GO0%R8b85I>BZ}P2L*Kf=)g<_36{7Zq6iW#$&M~Wg$U}!F&snDO%cVA z{BdkSMv2gZ#pO6sHYL=9RBly}Fc(QBcS6wVl)z%Eb>ia(?k|EMeLpS!85h__Sv_(r z%I|566PEDc60X?T^I#RT9)nnfR&3}pWwBc6YAn9&aS352;BO+df8&mNTu5yEsvd2= z&Jq6Zulc@P()EIt9m#9iqLv*SDP;?pLMA1#9VfOs+oO#AgbyHc3`jKU!AvUB&6!oG6 zN?wVr#TqeQhQ9jG97hFwb+$ihe|op|*~OiWhpkKZI`=O;y?Up${$=;F}e2+P>Ji^lj^tyPcnIcD62qGqY2m{rE<^dHceCfW7=mU}9zxw7z)Q z-a6mf+-}`E&oOo$ect)*t0#}H0)v+TJo(|?)Aehu^&7hYy9Fr$idXB{^F3`AdoFQ2 z3|jYp>^#`&z6uWO&^2|4Y}3)hXq#ypI=pS3ZcvP{RTDDIE0<9PzV%jp~2Os1|Q((e%EqoR)o-%zsH!`M;%2NavK*$FE)&P6#9}HJ9BlX|ahN18JC(3Gf=pQ1xQ5k6ep&o#^ 0: print(f"ASIN {asin} 存在修复商品信息按钮,正在点击...") self.clear_tab() @@ -556,11 +560,9 @@ class ApproveTask: if not task_id: self.log("任务ID为空,跳过", "WARNING") return - if not items: self.log("店铺列表为空,跳过", "WARNING") return - if not country_codes: self.log("国家列表为空,跳过", "WARNING") return @@ -673,16 +675,28 @@ class ApproveTask: if browser and browser != "店铺不存在": self.log(f"成功打开店铺 {shop_name}") - break + # break else: self.log(f"打开店铺失败: {browser}", "WARNING") driver = None + continue # 判断是否需要登录 need_login = driver.need_login() + print("【是否需要登录】:",need_login) if need_login: self.log(f"店铺 {shop_name} 需要登录,正在登录...") - password = "" + # 获取店铺凭证 + response = get_shop_info(shop_name) + print("【获取店铺凭证返回】:",response.text) + shop_data = response.json() + if not shop_data: + mes = f"获取店铺凭证失败,响应数据: {shop_data.get('message', '未知错误')}" + self.log(mes, "ERROR") + show_notification(mes, "ERROR") + continue + + password = shop_data["data"]["password"] login_success = driver.login(password) if login_success: @@ -697,7 +711,8 @@ class ApproveTask: else: self.log(f"店铺 {shop_name} 登录失败", "WARNING") driver = None - + else: + break except Exception as e: import traceback self.log(f"打开店铺异常: {traceback.format_exc()}", "INFO") diff --git a/app/amazon/del_brand.py b/app/amazon/del_brand.py index d0f60f2..4c92467 100644 --- a/app/amazon/del_brand.py +++ b/app/amazon/del_brand.py @@ -489,7 +489,9 @@ class AmamzonBase(ZiniaoDriver): 处理流程: """ - need_login_ele = self.tab.eles('xpath://h1[@class="a-spacing-small"]',timeout=5) + time.sleep(3) # 等待页面可能的登录元素加载,避免跳转等等 + self.tab.wait.doc_loaded(timeout=30, raise_err=False) + need_login_ele = self.tab.eles('xpath://h1[@class="a-spacing-small"]|//span[contains(text(),"登录")]',timeout=5) if len(need_login_ele) >0: print("检测到需要登录元素") return True @@ -497,13 +499,15 @@ class AmamzonBase(ZiniaoDriver): def login(self,password,username=""): try: - pwd_input = self.tab.ele('xpath://input[@type="password"]',timeout=10) - pwd_input.input(password) - submit_btn = self.tab.ele('xpath://input[@id="signInSubmit"]',timeout=10) - submit_btn.click() + pwd_input = self.tab.eles('xpath://input[@type="password"]',timeout=10) + if len(pwd_input) > 0: + pwd_input[0].input(password) + submit_btn = self.tab.eles('xpath://input[@id="signInSubmit"]',timeout=10) + if len(submit_btn) > 0: + submit_btn[0].click() self.tab.wait.doc_loaded() - opt_code_input = self.tab.ele('xpath://input[@name="otpCode"]',timeout=10) + opt_code_input = self.tab.ele('xpath://input[@name="otpCode"]',timeout=60) opt_code_input.wait.displayed(timeout=10,raise_err=False) for _ in range(30): if opt_code_input.value is not None and opt_code_input.value.strip() != "": @@ -512,6 +516,9 @@ class AmamzonBase(ZiniaoDriver): submit_btn.click() self.tab.wait.doc_loaded() return True + time.sleep(1) + submit_btn = self.tab.ele('xpath://input[@id="auth-signin-button"]',timeout=10) + submit_btn.click() except Exception as e: print("登录过程中发生异常:" + traceback.format_exc()) return False diff --git a/app/amazon/main.py b/app/amazon/main.py index 1f7d6f7..0e072bc 100644 --- a/app/amazon/main.py +++ b/app/amazon/main.py @@ -10,6 +10,9 @@ from amazon.approve import ApproveTask from amazon.match_action import MatchTak +from amazon.tool import get_shop_info,show_notification + + class TaskMonitor: """任务监控器:负责监控队列并执行品牌删除任务""" @@ -64,13 +67,13 @@ class TaskMonitor: if task_type == "delete-brand-run": # 提交删除品牌任务到线程池 - self.log(f"接收到删除品牌任务,提交到线程池处理...") + self.log(f"接收到【删除品牌】任务,提交到线程池处理...") future = self.executor.submit(self._process_task_wrapper, task_data) futures.append(future) elif task_type in task_type_info: # 提交产品风险审批任务到线程池 - self.log(f"接收到产品风险审批任务,提交到线程池处理...") + self.log(f"接收到任务,提交到线程池处理...") future = self.executor.submit(self._process_approve_task_wrapper, task_data, task_type_info[task_type]) futures.append(future) @@ -242,10 +245,22 @@ class TaskMonitor: driver = None # 判断是否需要登录 + driver.tab.wait.doc_loaded(timeout=30, raise_err=False) # 等待页面加载,避免过早判断登录状态 need_login = driver.need_login() + print("【是否需要登录】:",need_login) if need_login: self.log(f"店铺 {shop_name} 需要登录,正在登录...") - password = "" + # 获取店铺凭证 + response = get_shop_info(shop_name) + print("【获取店铺凭证返回】:",response.text) + shop_data = response.json() + if not shop_data: + mes = f"获取店铺凭证失败,响应数据: {shop_data.get('message', '未知错误')}" + self.log(mes, "ERROR") + show_notification(mes, "ERROR") + continue + + password = shop_data["data"]["password"] login_success = driver.login(password) if login_success: @@ -611,6 +626,7 @@ class TaskMonitor: verify=False # 忽略SSL证书验证 ) print("【结果提交】:",payload) + print("【结果提交返回】:",response.text) if response.status_code == 200: self.log(f"结果回传成功: {url}") diff --git a/app/amazon/match_action.py b/app/amazon/match_action.py index e0ad574..1841aa8 100644 --- a/app/amazon/match_action.py +++ b/app/amazon/match_action.py @@ -7,7 +7,7 @@ from config import runing_task, runing_shop from datetime import datetime from amazon.del_brand import AmamzonBase, kill_process -from amazon.tool import show_notification +from amazon.tool import show_notification,get_shop_info class AmzoneMatchAction(AmamzonBase): @@ -273,6 +273,8 @@ class MatchTak: try: self.process_shop(shop_item, country_codes, task_id, risk_listing_filter, user_id, stage_index, final_stage) + + # self.process_shop(shop_item, country_codes, task_id,risk_listing_filter) # 更新已处理店铺数 if task_id in runing_task: runing_task[task_id]["processed_shops"] += 1 @@ -299,6 +301,7 @@ class MatchTak: runing_task[task_id]["status"] = "failed" runing_task[task_id]["error"] = str(e) + # def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str): def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str, user_id=None, stage_index=None, final_stage: bool = True): """处理单个店铺 @@ -350,16 +353,27 @@ class MatchTak: if browser and browser != "店铺不存在": self.log(f"成功打开店铺 {shop_name}") - break else: self.log(f"打开店铺失败: {browser}", "WARNING") driver = None + continue # 判断是否需要登录 need_login = driver.need_login() + print("【是否需要登录】:",need_login) if need_login: self.log(f"店铺 {shop_name} 需要登录,正在登录...") - password = "" + # 获取店铺凭证 + response = get_shop_info(shop_name) + print("【获取店铺凭证返回】:",response.text) + shop_data = response.json() + if not shop_data: + mes = f"获取店铺凭证失败,响应数据: {shop_data.get('message', '未知错误')}" + self.log(mes, "ERROR") + show_notification(mes, "ERROR") + continue + + password = shop_data["data"]["password"] login_success = driver.login(password) if login_success: @@ -374,6 +388,8 @@ class MatchTak: else: self.log(f"店铺 {shop_name} 登录失败", "WARNING") driver = None + else: + break except Exception as e: import traceback @@ -409,7 +425,9 @@ class MatchTak: import traceback self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") self.log(traceback.format_exc(), "ERROR") + # 最后回传,标记完成 try: + # self.post_result(task_id, shop_name, country_code, "", "", is_done=True) if final_stage: self.post_result(task_id, shop_name, country_code, "", "", is_done=True) else: @@ -564,7 +582,6 @@ class MatchTak: runing_task[task_id]["processed_countries"] += 1 self.log(f"国家 {country_name} 处理完成") - def post_stage_finished(self, task_id: int, user_id, stage_index): import requests from config import DELETE_BRAND_API_BASE @@ -639,8 +656,8 @@ class MatchTak: max_retries = 3 for retry in range(max_retries): try: - print("================回传处理结果====================") - self.log(f"尝试回传结果 (第{retry + 1}/{max_retries} 次)") + print("================【匹配】=====================") + self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") self.log(f"回传URL: {url}") self.log(f"回传数据: {payload}") response = requests.post( @@ -653,9 +670,10 @@ class MatchTak: 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} - {status}") + self.log(f"结果回传成功: {asin} - {status}") return - self.log(f"回传结果失败,状态码: {response.status_code}", "WARNING") + else: + self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") print("=====================================") except Exception as e: @@ -666,7 +684,10 @@ class MatchTak: if retry < max_retries - 1: time.sleep(2) + self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") raise RuntimeError("已达到最大重试次数,结果回传最终失败") + + if __name__ == "__main__": user_info = { diff --git a/app/amazon/tool.py b/app/amazon/tool.py index 4f688cc..af48ded 100644 --- a/app/amazon/tool.py +++ b/app/amazon/tool.py @@ -5,6 +5,9 @@ except ImportError: webview = None +import requests +from urllib.parse import quote + def show_notification(message: str, message_type: str = "error"): """显示 pywebview 顶层通知(5秒后自动消失) @@ -75,3 +78,39 @@ def show_notification(message: str, message_type: str = "error"): print(f"显示通知失败: {str(e)}") + + +def get_shop_info(shop_name: str, base_url: str = "http://8.136.19.173:18080") -> requests.Response: + """ + 调用商铺凭证接口 + :param shop_name: 商铺名称,将自动进行 URL 编码 + :param base_url: API 基础地址,默认从 curl 中提取 + :return: requests.Response 对象 + """ + url = f"{base_url}/api/admin/shop-manages/credential" + params = {"shopName": shop_name} + + headers = { + "Accept": "*/*", + "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "Pragma": "no-cache", + "Referer": "http://8.136.19.173:18080/doc.html", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36", + "X-Internal-Token": "59c6691199917a2095827b5188502029", + } + + response = requests.get( + url, + params=params, + headers=headers, + verify=False, + timeout=30 + ) + return response + + + + + diff --git a/app/assets/delete-brand.js b/app/assets/delete-brand.js index 8b54b1e..3872715 100644 --- a/app/assets/delete-brand.js +++ b/app/assets/delete-brand.js @@ -1 +1 @@ -import{d as Oe,o as He,I as Je,a as u,c,b as Ge,B as je,e as r,F as K,r as re,t as f,f as p,J as Ve,K as Fe,n as Ne,g as m,h as W,L as ze,i as O,E as h,M as Qe,N as Xe,O as We,P as Ye,_ as Ze,p as es,q as ss}from"./pywebview-D7_PdvyM.js";import{e as ts}from"./brand-DysFlQbZ.js";const as={class:"page-shell module-page"},ns={class:"main-content"},ls={class:"left-panel"},rs={class:"upload-zone"},os={class:"selected-files clean-placeholder split-selected-files"},is={key:0,class:"more-line"},us={key:1},cs={class:"run-row"},ds=["disabled"],fs={class:"loading-msg"},vs={key:0,class:"queue-debug-card"},ps={key:0,class:"queue-debug-line"},hs={key:1,class:"queue-debug-payload"},_s={class:"right-panel"},gs={class:"task-list-wrap"},ys={class:"clean-result-summary"},ks={class:"summary-card"},ms={class:"summary-card"},ws={class:"summary-card"},Is={class:"result-list-wrap"},Ss={key:0,class:"empty-tasks"},bs={key:0,class:"result-subsection"},Cs={class:"task-list clean-result-list"},Ts={class:"left split-result-main"},Fs=["title"],Ns={class:"files"},Es={class:"files"},Rs={key:0,class:"files"},xs={key:1,class:"files"},$s={key:2,class:"files"},Ps={key:3,class:"time"},As={key:4,class:"delete-brand-progress-block"},Ds={class:"delete-brand-progress-header"},Ms={class:"delete-brand-progress-bar"},Bs={class:"files delete-brand-progress"},Us={key:5,class:"files split-entry-list delete-brand-preview"},qs={key:6,class:"files"},Ls={class:"task-right split-result-actions"},Ks=["onClick"],Os=["onClick"],Hs=["onClick"],Js={key:1,class:"result-subsection"},Gs={class:"task-list clean-result-list"},js={class:"left split-result-main"},Vs=["title"],zs={class:"files"},Qs={class:"files"},Xs={key:0,class:"files"},Ws={key:1,class:"files"},Ys={key:2,class:"time"},Zs={key:3,class:"delete-brand-progress-block"},et={class:"delete-brand-progress-header"},st={class:"delete-brand-progress-bar"},tt={class:"files delete-brand-progress"},at={key:4,class:"files split-entry-list delete-brand-preview"},nt={key:5,class:"files"},lt={class:"task-right split-result-actions"},rt=["onClick"],ot=["onClick"],it=Oe({__name:"BrandDeleteBrandTab",setup(ct){function M(){return`delete-brand:current-tasks:${typeof window<"u"&&window.localStorage.getItem("uid")||"0"}`}const $=m([]),H=m([]),B=m(!1),oe=m([]),v=m([]),J=m([]),G=m({total:0,successCount:0,failedCount:0,items:[]}),T=m(""),C=m(""),g=m({}),S=m(null),Y=m(!1),P=m(!1),A=m(""),j=m(!1),Z=W(()=>$.value.slice(0,10)),F=W(()=>{const e=[];return v.value.forEach(s=>{e.push(...s.items)}),e});function Ee(){try{const e=typeof window<"u"?window.localStorage.getItem(M()):null;if(e){if(v.value=JSON.parse(e),v.value.length>0){const s=v.value[v.value.length-1];T.value=s.queuePushResult||"",C.value=s.queuePayloadText||""}}else v.value=[]}catch{v.value=[]}}function ie(e,s,t,a){if(!s?.length)return;const n=v.value.findIndex(d=>d.taskId===e),o=n>=0?v.value[n]:null,l=s.map(d=>{const _=o?.items.find(Ke=>D(Ke,d)),k=Array.isArray(d.countries)?d.countries:void 0,y=Array.isArray(_?.countries)?_?.countries:void 0,w=k&&k.length>0?k:y&&y.length>0?y:k??y,I=Array.isArray(d.previewRows)?d.previewRows:void 0,b=Array.isArray(_?.previewRows)?_?.previewRows:void 0,le=I&&I.length>0?I:b&&b.length>0?b:I??b;return{...d,countries:w,previewRows:le,_pushed:_?._pushed??d._pushed??!1,_completed:_?._completed??d._completed??!1}}),i={taskId:e,items:l,createdAt:o?.createdAt||Date.now(),queuePushResult:t??o?.queuePushResult,queuePayloadText:a??o?.queuePayloadText};n>=0?v.value[n]=i:v.value.push(i),typeof window<"u"&&window.localStorage.setItem(M(),JSON.stringify(v.value))}function ue(e){const s=v.value.length;v.value=v.value.filter(t=>t.taskId!==e),v.value.length!==s&&typeof window<"u"&&window.localStorage.setItem(M(),JSON.stringify(v.value))}const V=W(()=>J.value.filter(e=>!F.value.some(s=>D(s,e)))),Re=W(()=>F.value.length>0||V.value.length>0);function ce(){typeof window<"u"&&window.localStorage.setItem(M(),JSON.stringify(v.value))}function N(e){return e?(v.value.find(t=>t.taskId===e)?.items.length||0)>1:!1}function ee(e){return e&&v.value.find(s=>s.taskId===e)||null}function D(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 E(e,s){const t=ee(e);return t&&t.items.find(a=>D(a,s))||null}function de(e){if(!e)return!1;const s=ee(e);if(!s)return!1;let t=!1;const a=g.value[e]?.line_progress?.info,n=N(e);if(a?.file_name&&a.current_line!=null&&a.total_lines!=null&&a.total_lines>0&&a.current_line>=a.total_lines){const o=s.items.find(l=>l.sourceFilename===a.file_name);o&&!o._completed&&(o._completed=!0,t=!0)}if(!n){const o=g.value[e]?.task?.status;if((o==="SUCCESS"||o==="FAILED")&&s.items.length===1){const l=s.items[0];l&&!l._completed&&(l._completed=!0,t=!0)}}return t&&ce(),t}function fe(e){return e&&g.value[e]?.task?.status||""}function z(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 ve(e){const s=e.taskId;if(!s)return!1;const t=g.value[s]?.line_progress,a=fe(s),n=N(s),o=x(e);if(n){const l=E(s,e),i=L(e)===A.value,d=!!(t?.has_progress&&t?.info?.file_name===e.sourceFilename);return!!(i||d||l?._pushed||(a==="RUNNING"||a==="PENDING"||!a)&&l?._completed)}return o==="本文件解析完毕"||o==="已被全局判定为终态"?!1:t?.has_progress||t?.info?!0:o==="已入队"||o==="处理中"}function pe(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 he(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 xe(){oe.value=[...F.value,...V.value]}function R(){xe(),$e(oe.value)}function $e(e){G.value={total:e.length,successCount:e.filter(s=>s.success).length,failedCount:e.filter(s=>!s.success).length,items:e}}function se(e){const s=e.taskId;return s&&(g.value[s]?.fileProgress||[]).find(n=>n.fileKey&&e.fileKey?n.fileKey===e.fileKey:n.sourceFilename&&e.sourceFilename?n.sourceFilename===e.sourceFilename:!1)||null}function _e(e){const s=e.taskId;if(!s)return"";const t=g.value[s],a=t?.line_progress?.info,n=se(e);if(N(s)){const i=E(s,e),d=t?.task?.status,_=!!(a?.file_name&&a.file_name===e.sourceFilename);let k=i?._completed?"COMPLETED":(i?._pushed,"PENDING"),y=0,w=Math.max(0,e.totalRows??n?.totalRows??0);d==="SUCCESS"||d==="FAILED"&&i?._completed?(k="COMPLETED",y=w):_?(k="RUNNING",y=Math.max(0,Math.min(w||Number.MAX_SAFE_INTEGER,a?.current_line??0)),!w&&a?.total_lines&&a.total_lines>0&&(w=a.total_lines)):i?._completed?(k="COMPLETED",y=w):i?._pushed&&(k="PENDING",y=0);const I=[];if(I.push(`文件状态:${k}`),I.push(`文件进度:${y}/${w}`),a?.finished_files!=null){const b=a.file_total&&a.file_total>0?`/${a.file_total}`:"";I.push(`已完成文件:${a.finished_files}${b}`)}return a?.phase&&I.push(`阶段:${a.phase}`),I.join("|")}if(n){const i=[],d=n.processedRows??0,_=n.totalRows??0;if(n.status&&i.push(`文件状态:${n.status}`),i.push(`文件进度:${d}/${_}`),a?.finished_files!=null){const k=a.file_total&&a.file_total>0?`/${a.file_total}`:"";i.push(`已完成文件:${a.finished_files}${k}`)}return a?.phase&&i.push(`阶段:${a.phase}`),i.join("|")}if(!t?.line_progress?.has_progress||!a){const i=t?.task?.status;return i?`任务状态:${i}`:""}const l=[];if(a.phase&&l.push(`阶段:${a.phase}`),a.file_index&&a.file_total&&l.push(`文件:${a.file_index}/${a.file_total}`),a.file_name&&l.push(`当前文件:${a.file_name}`),a.current_line!=null&&a.total_lines!=null&&l.push(`${N(s)?"当前文件进度":"进度"}:${a.current_line}/${a.total_lines}`),a.current_country&&l.push(`国家:${a.current_country}`),a.current_asin&&l.push(`ASIN:${a.current_asin}`),a.finished_files!=null){const i=a.file_total&&a.file_total>0?`/${a.file_total}`:"";l.push(`已完成文件:${a.finished_files}${i}`)}return l.join("|")}function Q(e){const s=e.taskId;if(!s)return 0;const t=g.value[s]?.line_progress?.info;if(N(s)){const l=E(s,e);if(g.value[s]?.task?.status==="SUCCESS"||l?._completed)return 100;const d=Math.max(0,e.totalRows??se(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&&d>0)return Math.max(0,Math.min(100,Math.round(t.current_line/d*100)))}return 0}const n=se(e);return n?Math.max(0,Math.min(100,n.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 ge(e){const s=g.value[e]?.task?.status;return s==="SUCCESS"||s==="FAILED"}function U(){const e=new Set;return v.value.forEach(s=>{s.items.some(t=>t._pushed)&&e.add(s.taskId)}),Array.from(e)}function x(e){const s=e.taskId;if(!s||!ee(s))return"";const a=E(s,e),n=fe(s),o=g.value[s]?.line_progress,l=N(s);if(!l&&(n==="SUCCESS"||n==="FAILED"||e.taskStatus==="SUCCESS"||e.taskStatus==="FAILED"))return"已被全局判定为终态";if(a?._completed)return"本文件解析完毕";if(n==="RUNNING"&&o?.has_progress&&o?.info?.file_name===e.sourceFilename)return"处理中";if(l&&!a?._pushed&&!a?._completed)return"未入队";if(l&&n==="SUCCESS")return"本文件解析完毕";if(!l){const i=g.value[s];if(i?.items&&i.items.find(_=>D(_,e))&&n==="SUCCESS")return"本文件解析完毕"}return a?._pushed?"已入队":"未入队"}function ye(e){if(e.downloadUrl)return!0;const s=e.taskId;return s?g.value[s]?.task?.status==="SUCCESS":!1}function Pe(e){const s=e?.task?.id;if(!s)return!1;const t=v.value.find(l=>l.taskId===s);if(!t)return!1;const a=e?.items||[];let n=!1;const o=t.items.map(l=>{const i=a.find(le=>D(le,l));if(!i)return l;const d=Array.isArray(i.countries)?i.countries:void 0,_=Array.isArray(l.countries)?l.countries:void 0,k=d&&d.length>0?d:_&&_.length>0?_:d??_,y=Array.isArray(i.previewRows)?i.previewRows:void 0,w=Array.isArray(l.previewRows)?l.previewRows:void 0,I=y&&y.length>0?y:w&&w.length>0?w:y??w,b={...l,...i,countries:k,previewRows:I,_pushed:l._pushed,_completed:l._completed};return JSON.stringify(b)!==JSON.stringify(l)&&(n=!0),b});for(const l of a)o.some(i=>D(i,l))||(o.push({...l,_pushed:!1,_completed:!1}),n=!0);return JSON.stringify(o)!==JSON.stringify(t.items)&&(t.items=o,n=!0),n&&ce(),n}async function te(e){const s=e||U();if(s.length)try{const t=await ze(s);let a=!1;for(const n of t.items||[]){const o=n?.task?.id;typeof o=="number"&&o>0&&(g.value[o]=n,Pe(n)&&(a=!0),de(o)&&(a=!0))}a&&R()}catch{}}function Ae(){return document.visibilityState==="visible"?4500:1e4}function ae(e=!1){if(S.value){if(!e)return;clearTimeout(S.value),S.value=null}const s=async()=>{if(S.value=null,Y.value){ae();return}const t=U();if(!t.length)return;Y.value=!0;let a=!1,n=!1;try{await te(t),await qe();for(const o of t)ge(o)&&(ue(o),a=!0,n=!0)}finally{Y.value=!1}n?await q():a&&R(),U().length>0&&ae()};e?s():S.value=window.setTimeout(s,Ae())}function ne(e=!1){S.value&&!e||ae(e)}function X(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 ke(){S.value&&(window.clearTimeout(S.value),S.value=null)}async function me(e){const s=O();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const a of e){const n=typeof a=="string"?a:a.absolutePath,o=typeof a=="string"?void 0:a.relativePath,l=await s.upload_file_to_java(n,o);if(!l?.success||!l.data)throw new Error(l?.error||l?.message||`上传失败:${n}`);t.push(l.data)}return t}async function De(){const e=O();if(!e?.select_brand_xlsx_files){h.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await e.select_brand_xlsx_files();if(!s?.length)return;$.value=s,H.value=await me(s),h.success(`已选择 ${s.length} 个删除品牌文件`)}catch(s){h.error(s instanceof Error?s.message:"选择失败")}}async function Me(){const e=O();if(!e?.select_brand_folder){h.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await e.select_brand_folder();if(!s)return;const t=await ts(s);if(!t.success||!t.items?.length){h.warning(t.error||"该文件夹下没有 xlsx 文件");return}$.value=t.items.map(a=>a.relativePath||a.absolutePath),H.value=await me(t.items),h.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`)}catch(s){h.error(s instanceof Error?s.message:"选择失败")}}async function Be(){if(!H.value.length){h.warning("请先选择待处理文件");return}try{B.value=!0;const e=await Qe({files:H.value.map(n=>({fileKey:n.fileKey,originalFilename:n.originalFilename,relativePath:n.relativePath}))}),s=pe(e.items||[]),t=s.some(n=>n.matchStatus==="MATCHED"),a=s.some(n=>n.matchStatus&&n.matchStatus!=="MATCHED");T.value="解析完成,等待手动点击打开紫鸟进行单任务处理",C.value="",s.length&&s[0].taskId&&ie(s[0].taskId,s,T.value,C.value),R(),a?h.warning("部分文件尚未命中可用店铺索引,已保留状态信息,请等待后台刷新后重试。"):t?h.success("删除品牌解析完成,请手动推送"):h.warning("当前没有可推送的已匹配文件,请先等待店铺索引刷新。"),await q()}catch(e){h.error(e instanceof Error?e.message:"执行失败")}finally{B.value=!1}}async function we(e){const s=e.taskId;if(!s){h.warning("未找到任务ID");return}const t=O(),a=Xe(s),n=e.outputFilename||e.sourceFilename||`delete-brand_${s}.xlsx`;if(t?.save_file_from_url_new){const o=await t.save_file_from_url_new(a,n);o.success?h.success(`已保存:${o.path||n}`):o.error&&o.error!=="用户取消"&&h.error(o.error);return}}async function q(){try{const e=await We();J.value=pe(e.items||[]),R(),await te(),ne(!0)}catch(e){console.error("loadHistory error:",e)}}function Ie(e){v.value.forEach(t=>{t.items=t.items.filter(a=>a.resultId!==e)});const s=v.value.length;v.value=v.value.filter(t=>t.items.length>0),v.value.length!==s&&typeof window<"u"&&window.localStorage.setItem(M(),JSON.stringify(v.value)),J.value=J.value.filter(t=>t.resultId!==e),R(),U().length===0&&ke()}async function Se(e){try{await Ye(e),Ie(e),await q(),h.success("已删除")}catch(s){const t=s instanceof Error?s.message:"删除失败";if(typeof t=="string"&&t.includes("记录不存在")){Ie(e),h.success("已删除");return}h.error(t)}}function be(e){const s=e.slice(0,5).map(a=>`${a.country}:${a.asin}${a.status?`(${a.status})`:""}`);return e.length-s.length>0?`${s.join("、")} 等 ${e.length} 条`:s.join("、")}function dt(e,s){}function Ce(){for(const e of v.value)for(const s of e.items){const t=x(s);if(t==="已入队"||t==="处理中")return!0}return!1}function L(e){return e.resultId!=null?`result:${e.resultId}`:`task:${e.taskId||0}:${e.sourceFilename||""}`}function Ue(){return F.value.find(e=>!e.openStoreUrl||L(e)===A.value||E(e.taskId,e)?._completed?!1:x(e)==="未入队")}async function Te(e,s){if(s?.auto&&Ce())return e.taskId,e.sourceFilename,!1;const t=O(),a=e.taskId;if(!a)return!1;const n=v.value.find(d=>d.taskId===a);if(!n)return!1;if(!t?.enqueue_json)return h.error("当前环境未启用 pywebview enqueue_json(浏览器环境不会推送)"),!1;const o={type:"delete-brand-run",ts:Date.now(),data:{taskId:a,items:[e]}};C.value=JSON.stringify(o,null,2);const l=await t.enqueue_json(o);let i="";if(l?.success){i=`已推送文件 ${e.sourceFilename},当前队列长度:${l.queue_size??"-"}`;const d=E(a,e);d&&(d._pushed=!0,d._completed=!1),A.value=L(e),ie(a,n.items,i,C.value),ne(!0)}else i=`推送到 Python 队列失败:${l?.error||"未知错误"}`;return T.value=i,!!l?.success}async function qe(){if(!P.value||j.value){P.value,j.value;return}if(Ce())return;const e=A.value;if(e){const t=F.value.find(a=>L(a)===e);if(t){const a=t.taskId,n=N(a);n&&(de(a),x(t),void 0);const o=x(t);if(o==="已入队"||o==="处理中"){t.sourceFilename;return}if(n){const l=E(a,t);if(l&&!l._completed){t.sourceFilename,l._pushed,l._completed;return}}}}const s=Ue();if(!s){A.value="",P.value=!1;return}j.value=!0;try{s.taskId,s.sourceFilename,L(s),await Te(s,{auto:!0})||(s.taskId,s.sourceFilename,P.value=!1)}finally{j.value=!1}}async function Le(e){P.value=!0,await Te(e)||(P.value=!1,A.value="")}return He(()=>{Ee();const e=U();e.length>0?te(e).then(async()=>{let s=!1,t=!1;for(const a of e)ge(a)&&(ue(a),s=!0,t=!0);t?await q():s&&R(),ne(!0)}):R(),q().catch(()=>{})}),Je(()=>{ke()}),(e,s)=>(u(),c("div",as,[Ge(je,{active:"delete-brand"}),r("div",ns,[r("aside",ls,[s[2]||(s[2]=r("div",{class:"section-title"},"选择文件",-1)),r("div",rs,[s[0]||(s[0]=r("div",{class:"hint"},"上传删除品牌 Excel;无论是直接上传文件还是上传文件夹批量导入,都会按每个 Excel 文件名作为店铺名。",-1)),r("div",{class:"btns"},[r("button",{type:"button",class:"opt-btn",onClick:De},"选择 Excel 文件"),r("button",{type:"button",class:"opt-btn",onClick:Me},"选择文件夹")]),r("div",os,[$.value.length?(u(),c(K,{key:0},[(u(!0),c(K,null,re(Z.value,t=>(u(),c("span",{key:t},f(t),1))),128)),$.value.length>Z.value.length?(u(),c("span",is," 还有 "+f($.value.length-Z.value.length)+" 个文件未展开显示 ",1)):p("",!0)],64)):(u(),c("span",us,"暂未选择删除品牌文件"))])]),s[3]||(s[3]=Ve('

执行说明
',2)),r("div",cs,[r("button",{type:"button",class:"btn-run",disabled:B.value,onClick:Be},f(B.value?"解析中...":"开始解析"),9,ds),r("span",fs,f(B.value?"正在读取删除品牌数据,请稍候…":"解析后会在右侧展示按国家分组的去重结果"),1)]),T.value||C.value?(u(),c("div",vs,[s[1]||(s[1]=r("div",{class:"section-title queue-debug-title"},"Python 队列推送结果",-1)),T.value?(u(),c("div",ps,f(T.value),1)):p("",!0),C.value?(u(),c("pre",hs,f(C.value),1)):p("",!0)])):p("",!0)]),r("section",_s,[s[12]||(s[12]=r("div",{class:"panel-header"},"删除品牌结果",-1)),r("div",gs,[r("div",ys,[r("div",ks,[s[4]||(s[4]=r("span",{class:"summary-label"},"已处理文件",-1)),r("strong",null,f(G.value.total),1)]),r("div",ms,[s[5]||(s[5]=r("span",{class:"summary-label"},"成功结果",-1)),r("strong",null,f(G.value.successCount),1)]),r("div",ws,[s[6]||(s[6]=r("span",{class:"summary-label"},"失败文件",-1)),r("strong",null,f(G.value.failedCount),1)])]),r("div",Is,[s[11]||(s[11]=r("div",{class:"result-list-header"},[r("span",null,"删除品牌结果列表")],-1)),Re.value?(u(),c(K,{key:1},[F.value.length?(u(),c("div",bs,[s[8]||(s[8]=r("div",{class:"result-subsection-title"},"当前任务",-1)),r("ul",Cs,[(u(!0),c(K,null,re(F.value,t=>(u(),c("li",{key:`current-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[r("div",Ts,[r("span",{class:"id",title:t.sourceFilename},f(t.sourceFilename||"-"),9,Fs),r("div",Ns,"店铺名:"+f(t.shopName||"-"),1),r("div",Es,"匹配结果:"+f(he(t)),1),t.platform?(u(),c("div",Rs,"平台:"+f(t.platform),1)):p("",!0),x(t)?(u(),c("div",xs,"队列状态:"+f(x(t)),1)):p("",!0),t.countryCount!==void 0&&t.matched?(u(),c("div",$s,"国家数:"+f(t.countryCount),1)):p("",!0),t.totalRows!==void 0&&t.matched?(u(),c("div",Ps,"去重后 "+f(t.totalRows)+" 条 ",1)):p("",!0),ve(t)?(u(),c("div",As,[r("div",Ds,[s[7]||(s[7]=r("span",null,"任务进度",-1)),r("span",null,f(Q(t))+"%",1)]),r("div",Ms,[r("div",{class:"delete-brand-progress-bar-fill",style:Fe({width:`${Q(t)}%`})},null,4)]),r("div",Bs,f(_e(t)),1)])):p("",!0),t.previewRows?.length?(u(),c("div",Us,f(be(t.previewRows)),1)):p("",!0),z(t)?(u(),c("div",qs,"错误信息:"+f(z(t)),1)):p("",!0)]),r("div",Ls,[r("span",{class:Ne(["status",X(t).className])},f(X(t).text),3),t.openStoreUrl?(u(),c("button",{key:0,type:"button",class:"download",onClick:a=>Le(t)}," 打开紫鸟 ",8,Ks)):p("",!0),ye(t)?(u(),c("button",{key:1,type:"button",class:"download",onClick:a=>we(t)}," 下载 ",8,Os)):p("",!0),t.resultId?(u(),c("button",{key:2,type:"button",class:"btn-delete",onClick:a=>Se(t.resultId)}," 删除 ",8,Hs)):p("",!0)])]))),128))])])):p("",!0),V.value.length?(u(),c("div",Js,[s[10]||(s[10]=r("div",{class:"result-subsection-title"},"历史记录",-1)),r("ul",Gs,[(u(!0),c(K,null,re(V.value,t=>(u(),c("li",{key:`history-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[r("div",js,[r("span",{class:"id",title:t.sourceFilename},f(t.sourceFilename||"-"),9,Vs),r("div",zs,"店铺名:"+f(t.shopName||"-"),1),r("div",Qs,"匹配结果:"+f(he(t)),1),t.platform?(u(),c("div",Xs,"平台:"+f(t.platform),1)):p("",!0),t.countryCount!==void 0&&t.matched?(u(),c("div",Ws,"国家数:"+f(t.countryCount),1)):p("",!0),t.totalRows!==void 0&&t.matched?(u(),c("div",Ys,"去重后 "+f(t.totalRows)+" 条 ",1)):p("",!0),ve(t)?(u(),c("div",Zs,[r("div",et,[s[9]||(s[9]=r("span",null,"任务进度",-1)),r("span",null,f(Q(t))+"%",1)]),r("div",st,[r("div",{class:"delete-brand-progress-bar-fill",style:Fe({width:`${Q(t)}%`})},null,4)]),r("div",tt,f(_e(t)),1)])):p("",!0),t.previewRows?.length?(u(),c("div",at,f(be(t.previewRows)),1)):p("",!0),z(t)?(u(),c("div",nt,"错误信息:"+f(z(t)),1)):p("",!0)]),r("div",lt,[r("span",{class:Ne(["status",X(t).className])},f(X(t).text),3),ye(t)?(u(),c("button",{key:0,type:"button",class:"download",onClick:a=>we(t)}," 下载 ",8,rt)):p("",!0),t.resultId?(u(),c("button",{key:1,type:"button",class:"btn-delete",onClick:a=>Se(t.resultId)}," 删除 ",8,ot)):p("",!0)])]))),128))])])):p("",!0)],64)):(u(),c("div",Ss," 暂无删除品牌结果,完成解析后会在这里展示按国家分组的去重结果 "))])])])])]))}}),ut=Ze(it,[["__scopeId","data-v-468f2aa7"]]);es(ut).use(ss).mount("#app"); +import{d as Je,o as Ge,I as je,a as u,c,b as ze,B as Ve,e as r,F as K,r as oe,t as v,f as h,J as Qe,K as Ee,n as Ne,g as m,h as W,L as Xe,i as H,E as p,M as We,N as Ye,O as Ze,P as es,_ as ss,p as ts,q as ns}from"./pywebview-D7_PdvyM.js";import{e as as}from"./brand-DysFlQbZ.js";const ls={class:"page-shell module-page"},rs={class:"main-content"},os={class:"left-panel"},is={class:"upload-zone"},us={class:"selected-files clean-placeholder split-selected-files"},cs={key:0,class:"more-line"},ds={key:1},fs={class:"run-row"},vs=["disabled"],hs={class:"loading-msg"},ps={key:0,class:"queue-debug-card"},_s={key:0,class:"queue-debug-line"},gs={key:1,class:"queue-debug-payload"},ys={class:"right-panel"},ks={class:"task-list-wrap"},ms={class:"clean-result-summary"},ws={class:"summary-card"},Is={class:"summary-card"},bs={class:"summary-card"},Ss={class:"result-list-wrap"},Cs={key:0,class:"empty-tasks"},Ts={key:0,class:"result-subsection"},Fs={class:"task-list clean-result-list"},Es={class:"left split-result-main"},Ns=["title"],Rs={class:"files"},xs={class:"files"},Ps={key:0,class:"files"},$s={key:1,class:"files"},As={key:2,class:"files"},Ds={key:3,class:"time"},Ms={key:4,class:"delete-brand-progress-block"},Bs={class:"delete-brand-progress-header"},Us={class:"delete-brand-progress-bar"},qs={class:"files delete-brand-progress"},Ls={key:5,class:"files split-entry-list delete-brand-preview"},Os={key:6,class:"files"},Ks={class:"task-right split-result-actions"},Hs=["onClick"],Js=["onClick"],Gs=["onClick"],js={key:1,class:"result-subsection"},zs={class:"task-list clean-result-list"},Vs={class:"left split-result-main"},Qs=["title"],Xs={class:"files"},Ws={class:"files"},Ys={key:0,class:"files"},Zs={key:1,class:"files"},et={key:2,class:"time"},st={key:3,class:"delete-brand-progress-block"},tt={class:"delete-brand-progress-header"},nt={class:"delete-brand-progress-bar"},at={class:"files delete-brand-progress"},lt={key:4,class:"files split-entry-list delete-brand-preview"},rt={key:5,class:"files"},ot={class:"task-right split-result-actions"},it=["onClick"],ut=["onClick"],ct=Je({__name:"BrandDeleteBrandTab",setup(ft){function M(){return`delete-brand:current-tasks:${typeof window<"u"&&window.localStorage.getItem("uid")||"0"}`}const P=m([]),J=m([]),B=m(!1),ie=m([]),d=m([]),U=m([]),G=m({total:0,successCount:0,failedCount:0,items:[]}),T=m(""),C=m(""),g=m({}),b=m(null),Y=m(!1),$=m(!1),A=m(""),j=m(!1),Z=W(()=>P.value.slice(0,10)),F=W(()=>{const e=[];return d.value.forEach(s=>{e.push(...s.items)}),e});function Re(){try{const e=typeof window<"u"?window.localStorage.getItem(M()):null;if(e){if(d.value=JSON.parse(e),d.value.length>0){const s=d.value[d.value.length-1];T.value=s.queuePushResult||"",C.value=s.queuePayloadText||""}}else d.value=[]}catch{d.value=[]}}function ue(e,s,t,n){if(!s?.length)return;const a=d.value.findIndex(f=>f.taskId===e),o=a>=0?d.value[a]:null,l=s.map(f=>{const _=o?.items.find(He=>D(He,f)),k=Array.isArray(f.countries)?f.countries:void 0,y=Array.isArray(_?.countries)?_?.countries:void 0,w=k&&k.length>0?k:y&&y.length>0?y:k??y,I=Array.isArray(f.previewRows)?f.previewRows:void 0,S=Array.isArray(_?.previewRows)?_?.previewRows:void 0,re=I&&I.length>0?I:S&&S.length>0?S:I??S;return{...f,countries:w,previewRows:re,_pushed:_?._pushed??f._pushed??!1,_completed:_?._completed??f._completed??!1}}),i={taskId:e,items:l,createdAt:o?.createdAt||Date.now(),queuePushResult:t??o?.queuePushResult,queuePayloadText:n??o?.queuePayloadText};a>=0?d.value[a]=i:d.value.push(i),typeof window<"u"&&window.localStorage.setItem(M(),JSON.stringify(d.value))}function ce(e){const s=d.value.length;d.value=d.value.filter(t=>t.taskId!==e),d.value.length!==s&&typeof window<"u"&&window.localStorage.setItem(M(),JSON.stringify(d.value))}function de(e){return e==="SUCCESS"||e==="FAILED"||e==="COMPLETED"}function xe(e){if(!e?.length)return!1;const s=new Set;if(e.forEach(n=>{n.taskId&&de(n.taskStatus)&&s.add(n.taskId)}),!s.size)return!1;const t=d.value.length;return d.value=d.value.filter(n=>!s.has(n.taskId)),d.value.length!==t?(ee(),!0):!1}const z=W(()=>U.value.filter(e=>!F.value.some(s=>D(s,e)))),Pe=W(()=>F.value.length>0||z.value.length>0);function ee(){typeof window<"u"&&window.localStorage.setItem(M(),JSON.stringify(d.value))}function E(e){return e?(d.value.find(t=>t.taskId===e)?.items.length||0)>1:!1}function se(e){return e&&d.value.find(s=>s.taskId===e)||null}function D(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 N(e,s){const t=se(e);return t&&t.items.find(n=>D(n,s))||null}function fe(e){if(!e)return!1;const s=se(e);if(!s)return!1;let t=!1;const n=g.value[e]?.line_progress?.info,a=E(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(l=>l.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 l=s.items[0];l&&!l._completed&&(l._completed=!0,t=!0)}}return t&&ee(),t}function ve(e){return e&&g.value[e]?.task?.status||""}function V(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 he(e){const s=e.taskId;if(!s)return!1;const t=g.value[s]?.line_progress,n=ve(s),a=E(s),o=x(e);if(a){const l=N(s,e),i=O(e)===A.value,f=!!(t?.has_progress&&t?.info?.file_name===e.sourceFilename);return!!(i||f||l?._pushed||(n==="RUNNING"||n==="PENDING"||!n)&&l?._completed)}return o==="本文件解析完毕"||o==="已被全局判定为终态"?!1:t?.has_progress||t?.info?!0:o==="已入队"||o==="处理中"}function pe(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 _e(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 $e(){ie.value=[...F.value,...z.value]}function R(){$e(),Ae(ie.value)}function Ae(e){G.value={total:e.length,successCount:e.filter(s=>s.success).length,failedCount:e.filter(s=>!s.success).length,items:e}}function te(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 ge(e){const s=e.taskId;if(!s)return"";const t=g.value[s],n=t?.line_progress?.info,a=te(e);if(E(s)){const i=N(s,e),f=t?.task?.status,_=!!(n?.file_name&&n.file_name===e.sourceFilename);let k=i?._completed?"COMPLETED":(i?._pushed,"PENDING"),y=0,w=Math.max(0,e.totalRows??a?.totalRows??0);f==="SUCCESS"||f==="FAILED"&&i?._completed?(k="COMPLETED",y=w):_?(k="RUNNING",y=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)):i?._completed?(k="COMPLETED",y=w):i?._pushed&&(k="PENDING",y=0);const I=[];if(I.push(`文件状态:${k}`),I.push(`文件进度:${y}/${w}`),n?.finished_files!=null){const S=n.file_total&&n.file_total>0?`/${n.file_total}`:"";I.push(`已完成文件:${n.finished_files}${S}`)}return n?.phase&&I.push(`阶段:${n.phase}`),I.join("|")}if(a){const i=[],f=a.processedRows??0,_=a.totalRows??0;if(a.status&&i.push(`文件状态:${a.status}`),i.push(`文件进度:${f}/${_}`),n?.finished_files!=null){const k=n.file_total&&n.file_total>0?`/${n.file_total}`:"";i.push(`已完成文件:${n.finished_files}${k}`)}return n?.phase&&i.push(`阶段:${n.phase}`),i.join("|")}if(!t?.line_progress?.has_progress||!n){const i=t?.task?.status;return i?`任务状态:${i}`:""}const l=[];if(n.phase&&l.push(`阶段:${n.phase}`),n.file_index&&n.file_total&&l.push(`文件:${n.file_index}/${n.file_total}`),n.file_name&&l.push(`当前文件:${n.file_name}`),n.current_line!=null&&n.total_lines!=null&&l.push(`${E(s)?"当前文件进度":"进度"}:${n.current_line}/${n.total_lines}`),n.current_country&&l.push(`国家:${n.current_country}`),n.current_asin&&l.push(`ASIN:${n.current_asin}`),n.finished_files!=null){const i=n.file_total&&n.file_total>0?`/${n.file_total}`:"";l.push(`已完成文件:${n.finished_files}${i}`)}return l.join("|")}function Q(e){const s=e.taskId;if(!s)return 0;const t=g.value[s]?.line_progress?.info;if(E(s)){const l=N(s,e);if(g.value[s]?.task?.status==="SUCCESS"||l?._completed)return 100;const f=Math.max(0,e.totalRows??te(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&&f>0)return Math.max(0,Math.min(100,Math.round(t.current_line/f*100)))}return 0}const a=te(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 ye(e){const s=g.value[e]?.task?.status;return de(s)}function q(){const e=new Set;return d.value.forEach(s=>{s.items.some(t=>t._pushed)&&e.add(s.taskId)}),Array.from(e)}function x(e){const s=e.taskId;if(!s||!se(s))return"";const n=N(s,e),a=ve(s),o=g.value[s]?.line_progress,l=E(s);if(!l&&(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(l&&!n?._pushed&&!n?._completed)return"未入队";if(l&&a==="SUCCESS")return"本文件解析完毕";if(!l){const i=g.value[s];if(i?.items&&i.items.find(_=>D(_,e))&&a==="SUCCESS")return"本文件解析完毕"}return n?._pushed?"已入队":"未入队"}function ke(e){if(e.downloadUrl)return!0;const s=e.taskId;return s?g.value[s]?.task?.status==="SUCCESS":!1}function De(e){const s=e?.task?.id;if(!s)return!1;const t=d.value.find(l=>l.taskId===s);if(!t)return!1;const n=e?.items||[];let a=!1;const o=t.items.map(l=>{const i=n.find(re=>D(re,l));if(!i)return l;const f=Array.isArray(i.countries)?i.countries:void 0,_=Array.isArray(l.countries)?l.countries:void 0,k=f&&f.length>0?f:_&&_.length>0?_:f??_,y=Array.isArray(i.previewRows)?i.previewRows:void 0,w=Array.isArray(l.previewRows)?l.previewRows:void 0,I=y&&y.length>0?y:w&&w.length>0?w:y??w,S={...l,...i,countries:k,previewRows:I,_pushed:l._pushed,_completed:l._completed};return JSON.stringify(S)!==JSON.stringify(l)&&(a=!0),S});for(const l of n)o.some(i=>D(i,l))||(o.push({...l,_pushed:!1,_completed:!1}),a=!0);return JSON.stringify(o)!==JSON.stringify(t.items)&&(t.items=o,a=!0),a&&ee(),a}async function ne(e){const s=e||q();if(s.length)try{const t=await Xe(s);let n=!1;for(const a of t.items||[]){const o=a?.task?.id;typeof o=="number"&&o>0&&(g.value[o]=a,De(a)&&(n=!0),fe(o)&&(n=!0))}n&&R()}catch{}}function Me(){return document.visibilityState==="visible"?4500:1e4}function ae(e=!1){if(b.value){if(!e)return;clearTimeout(b.value),b.value=null}const s=async()=>{if(b.value=null,Y.value){ae();return}const t=q();if(!t.length)return;Y.value=!0;let n=!1,a=!1;try{await ne(t),await Oe();for(const o of t)ye(o)&&(ce(o),n=!0,a=!0)}finally{Y.value=!1}a?await L():n&&R(),q().length>0&&ae()};e?s():b.value=window.setTimeout(s,Me())}function le(e=!1){b.value&&!e||ae(e)}function X(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 me(){b.value&&(window.clearTimeout(b.value),b.value=null)}async function we(e){const s=H();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,l=await s.upload_file_to_java(a,o);if(!l?.success||!l.data)throw new Error(l?.error||l?.message||`上传失败:${a}`);t.push(l.data)}return t}async function Be(){const e=H();if(!e?.select_brand_xlsx_files){p.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await e.select_brand_xlsx_files();if(!s?.length)return;P.value=s,J.value=await we(s),p.success(`已选择 ${s.length} 个删除品牌文件`)}catch(s){p.error(s instanceof Error?s.message:"选择失败")}}async function Ue(){const e=H();if(!e?.select_brand_folder){p.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await e.select_brand_folder();if(!s)return;const t=await as(s);if(!t.success||!t.items?.length){p.warning(t.error||"该文件夹下没有 xlsx 文件");return}P.value=t.items.map(n=>n.relativePath||n.absolutePath),J.value=await we(t.items),p.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`)}catch(s){p.error(s instanceof Error?s.message:"选择失败")}}async function qe(){if(!J.value.length){p.warning("请先选择待处理文件");return}try{B.value=!0;const e=await We({files:J.value.map(a=>({fileKey:a.fileKey,originalFilename:a.originalFilename,relativePath:a.relativePath}))}),s=pe(e.items||[]),t=s.some(a=>a.matchStatus==="MATCHED"),n=s.some(a=>a.matchStatus&&a.matchStatus!=="MATCHED");T.value="解析完成,等待手动点击打开紫鸟进行单任务处理",C.value="",s.length&&s[0].taskId&&ue(s[0].taskId,s,T.value,C.value),R(),n?p.warning("部分文件尚未命中可用店铺索引,已保留状态信息,请等待后台刷新后重试。"):t?p.success("删除品牌解析完成,请手动推送"):p.warning("当前没有可推送的已匹配文件,请先等待店铺索引刷新。"),await L()}catch(e){p.error(e instanceof Error?e.message:"执行失败")}finally{B.value=!1}}async function Ie(e){const s=e.taskId;if(!s){p.warning("未找到任务ID");return}const t=H(),n=Ye(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 L(){try{const e=await Ze();U.value=pe(e.items||[]),xe(U.value),R(),await ne(),le(!0)}catch(e){console.error("loadHistory error:",e)}}function be(e){d.value.forEach(t=>{t.items=t.items.filter(n=>n.resultId!==e)});const s=d.value.length;d.value=d.value.filter(t=>t.items.length>0),d.value.length!==s&&typeof window<"u"&&window.localStorage.setItem(M(),JSON.stringify(d.value)),U.value=U.value.filter(t=>t.resultId!==e),R(),q().length===0&&me()}async function Se(e){try{await es(e),be(e),await L(),p.success("已删除")}catch(s){const t=s instanceof Error?s.message:"删除失败";if(typeof t=="string"&&t.includes("记录不存在")){be(e),p.success("已删除");return}p.error(t)}}function Ce(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 vt(e,s){}function Te(){for(const e of d.value)for(const s of e.items){const t=x(s);if(t==="已入队"||t==="处理中")return!0}return!1}function O(e){return e.resultId!=null?`result:${e.resultId}`:`task:${e.taskId||0}:${e.sourceFilename||""}`}function Le(){return F.value.find(e=>!e.openStoreUrl||O(e)===A.value||N(e.taskId,e)?._completed?!1:x(e)==="未入队")}async function Fe(e,s){if(s?.auto&&Te())return e.taskId,e.sourceFilename,!1;const t=H(),n=e.taskId;if(!n)return!1;const a=d.value.find(f=>f.taskId===n);if(!a)return!1;if(!t?.enqueue_json)return p.error("当前环境未启用 pywebview enqueue_json(浏览器环境不会推送)"),!1;const o={type:"delete-brand-run",ts:Date.now(),data:{taskId:n,items:[e]}};C.value=JSON.stringify(o,null,2);const l=await t.enqueue_json(o);let i="";if(l?.success){i=`已推送文件 ${e.sourceFilename},当前队列长度:${l.queue_size??"-"}`;const f=N(n,e);f&&(f._pushed=!0,f._completed=!1),A.value=O(e),ue(n,a.items,i,C.value),le(!0)}else i=`推送到 Python 队列失败:${l?.error||"未知错误"}`;return T.value=i,!!l?.success}async function Oe(){if(!$.value||j.value){$.value,j.value;return}if(Te())return;const e=A.value;if(e){const t=F.value.find(n=>O(n)===e);if(t){const n=t.taskId,a=E(n);a&&(fe(n),x(t),void 0);const o=x(t);if(o==="已入队"||o==="处理中"){t.sourceFilename;return}if(a){const l=N(n,t);if(l&&!l._completed){t.sourceFilename,l._pushed,l._completed;return}}}}const s=Le();if(!s){A.value="",$.value=!1;return}j.value=!0;try{s.taskId,s.sourceFilename,O(s),await Fe(s,{auto:!0})||(s.taskId,s.sourceFilename,$.value=!1)}finally{j.value=!1}}async function Ke(e){$.value=!0,await Fe(e)||($.value=!1,A.value="")}return Ge(()=>{Re();const e=q();e.length>0?ne(e).then(async()=>{let s=!1,t=!1;for(const n of e)ye(n)&&(ce(n),s=!0,t=!0);t?await L():s&&R(),le(!0)}):R(),L().catch(()=>{})}),je(()=>{me()}),(e,s)=>(u(),c("div",ls,[ze(Ve,{active:"delete-brand"}),r("div",rs,[r("aside",os,[s[2]||(s[2]=r("div",{class:"section-title"},"选择文件",-1)),r("div",is,[s[0]||(s[0]=r("div",{class:"hint"},"上传删除品牌 Excel;无论是直接上传文件还是上传文件夹批量导入,都会按每个 Excel 文件名作为店铺名。",-1)),r("div",{class:"btns"},[r("button",{type:"button",class:"opt-btn",onClick:Be},"选择 Excel 文件"),r("button",{type:"button",class:"opt-btn",onClick:Ue},"选择文件夹")]),r("div",us,[P.value.length?(u(),c(K,{key:0},[(u(!0),c(K,null,oe(Z.value,t=>(u(),c("span",{key:t},v(t),1))),128)),P.value.length>Z.value.length?(u(),c("span",cs," 还有 "+v(P.value.length-Z.value.length)+" 个文件未展开显示 ",1)):h("",!0)],64)):(u(),c("span",ds,"暂未选择删除品牌文件"))])]),s[3]||(s[3]=Qe('
执行说明
',2)),r("div",fs,[r("button",{type:"button",class:"btn-run",disabled:B.value,onClick:qe},v(B.value?"解析中...":"开始解析"),9,vs),r("span",hs,v(B.value?"正在读取删除品牌数据,请稍候…":"解析后会在右侧展示按国家分组的去重结果"),1)]),T.value||C.value?(u(),c("div",ps,[s[1]||(s[1]=r("div",{class:"section-title queue-debug-title"},"Python 队列推送结果",-1)),T.value?(u(),c("div",_s,v(T.value),1)):h("",!0),C.value?(u(),c("pre",gs,v(C.value),1)):h("",!0)])):h("",!0)]),r("section",ys,[s[12]||(s[12]=r("div",{class:"panel-header"},"删除品牌结果",-1)),r("div",ks,[r("div",ms,[r("div",ws,[s[4]||(s[4]=r("span",{class:"summary-label"},"已处理文件",-1)),r("strong",null,v(G.value.total),1)]),r("div",Is,[s[5]||(s[5]=r("span",{class:"summary-label"},"成功结果",-1)),r("strong",null,v(G.value.successCount),1)]),r("div",bs,[s[6]||(s[6]=r("span",{class:"summary-label"},"失败文件",-1)),r("strong",null,v(G.value.failedCount),1)])]),r("div",Ss,[s[11]||(s[11]=r("div",{class:"result-list-header"},[r("span",null,"删除品牌结果列表")],-1)),Pe.value?(u(),c(K,{key:1},[F.value.length?(u(),c("div",Ts,[s[8]||(s[8]=r("div",{class:"result-subsection-title"},"当前任务",-1)),r("ul",Fs,[(u(!0),c(K,null,oe(F.value,t=>(u(),c("li",{key:`current-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[r("div",Es,[r("span",{class:"id",title:t.sourceFilename},v(t.sourceFilename||"-"),9,Ns),r("div",Rs,"店铺名:"+v(t.shopName||"-"),1),r("div",xs,"匹配结果:"+v(_e(t)),1),t.platform?(u(),c("div",Ps,"平台:"+v(t.platform),1)):h("",!0),x(t)?(u(),c("div",$s,"队列状态:"+v(x(t)),1)):h("",!0),t.countryCount!==void 0&&t.matched?(u(),c("div",As,"国家数:"+v(t.countryCount),1)):h("",!0),t.totalRows!==void 0&&t.matched?(u(),c("div",Ds,"去重后 "+v(t.totalRows)+" 条 ",1)):h("",!0),he(t)?(u(),c("div",Ms,[r("div",Bs,[s[7]||(s[7]=r("span",null,"任务进度",-1)),r("span",null,v(Q(t))+"%",1)]),r("div",Us,[r("div",{class:"delete-brand-progress-bar-fill",style:Ee({width:`${Q(t)}%`})},null,4)]),r("div",qs,v(ge(t)),1)])):h("",!0),t.previewRows?.length?(u(),c("div",Ls,v(Ce(t.previewRows)),1)):h("",!0),V(t)?(u(),c("div",Os,"错误信息:"+v(V(t)),1)):h("",!0)]),r("div",Ks,[r("span",{class:Ne(["status",X(t).className])},v(X(t).text),3),t.openStoreUrl?(u(),c("button",{key:0,type:"button",class:"download",onClick:n=>Ke(t)}," 打开紫鸟 ",8,Hs)):h("",!0),ke(t)?(u(),c("button",{key:1,type:"button",class:"download",onClick:n=>Ie(t)}," 下载 ",8,Js)):h("",!0),t.resultId?(u(),c("button",{key:2,type:"button",class:"btn-delete",onClick:n=>Se(t.resultId)}," 删除 ",8,Gs)):h("",!0)])]))),128))])])):h("",!0),z.value.length?(u(),c("div",js,[s[10]||(s[10]=r("div",{class:"result-subsection-title"},"历史记录",-1)),r("ul",zs,[(u(!0),c(K,null,oe(z.value,t=>(u(),c("li",{key:`history-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[r("div",Vs,[r("span",{class:"id",title:t.sourceFilename},v(t.sourceFilename||"-"),9,Qs),r("div",Xs,"店铺名:"+v(t.shopName||"-"),1),r("div",Ws,"匹配结果:"+v(_e(t)),1),t.platform?(u(),c("div",Ys,"平台:"+v(t.platform),1)):h("",!0),t.countryCount!==void 0&&t.matched?(u(),c("div",Zs,"国家数:"+v(t.countryCount),1)):h("",!0),t.totalRows!==void 0&&t.matched?(u(),c("div",et,"去重后 "+v(t.totalRows)+" 条 ",1)):h("",!0),he(t)?(u(),c("div",st,[r("div",tt,[s[9]||(s[9]=r("span",null,"任务进度",-1)),r("span",null,v(Q(t))+"%",1)]),r("div",nt,[r("div",{class:"delete-brand-progress-bar-fill",style:Ee({width:`${Q(t)}%`})},null,4)]),r("div",at,v(ge(t)),1)])):h("",!0),t.previewRows?.length?(u(),c("div",lt,v(Ce(t.previewRows)),1)):h("",!0),V(t)?(u(),c("div",rt,"错误信息:"+v(V(t)),1)):h("",!0)]),r("div",ot,[r("span",{class:Ne(["status",X(t).className])},v(X(t).text),3),ke(t)?(u(),c("button",{key:0,type:"button",class:"download",onClick:n=>Ie(t)}," 下载 ",8,it)):h("",!0),t.resultId?(u(),c("button",{key:1,type:"button",class:"btn-delete",onClick:n=>Se(t.resultId)}," 删除 ",8,ut)):h("",!0)])]))),128))])])):h("",!0)],64)):(u(),c("div",Cs," 暂无删除品牌结果,完成解析后会在这里展示按国家分组的去重结果 "))])])])])]))}}),dt=ss(ct,[["__scopeId","data-v-beec339e"]]);ts(dt).use(ns).mount("#app"); diff --git a/app/new_web_source/delete-brand.html b/app/new_web_source/delete-brand.html index 9f4323e..f56cd3d 100644 --- a/app/new_web_source/delete-brand.html +++ b/app/new_web_source/delete-brand.html @@ -8,7 +8,7 @@ - +