From 46d91fd8ca63df385d70ad6bf9f1ca24f023379b Mon Sep 17 00:00:00 2001 From: super <2903208875@qq.com> Date: Fri, 3 Apr 2026 00:53:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=8E=A5=E5=8F=A3=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/.env | 3 +- app/amazon/__pycache__/main.cpython-312.pyc | Bin 25649 -> 26386 bytes app/assets/delete-brand.js | 2 +- app/new_web_source/delete-brand.html | 2 +- .../aiimage-backend.log.2026-04-02.0.gz | Bin 0 -> 26282 bytes .../model/vo/DeleteBrandTaskDetailVo.java | 3 + .../vo/DeleteBrandTaskFileProgressVo.java | 27 +++++ .../service/DeleteBrandRunService.java | 72 ++++++++++++- .../brand/components/BrandDeleteBrandTab.vue | 95 +++++++++++++----- frontend-vue/src/shared/api/java-modules.ts | 10 ++ 10 files changed, 184 insertions(+), 30 deletions(-) create mode 100644 backend-java/aiimage-backend.log.2026-04-02.0.gz create mode 100644 backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/model/vo/DeleteBrandTaskFileProgressVo.java diff --git a/app/.env b/app/.env index e40b987..856e41a 100644 --- a/app/.env +++ b/app/.env @@ -12,6 +12,7 @@ zn_username=%E8%87%AA%E5%8A%A8%E5%8C%96_Robot client_name=ShuFuAI -java_api_base=http://8.136.19.173:18080 +java_api_base=http://127.0.0.1:18080 +# java_api_base=http://8.136.19.173:18080 diff --git a/app/amazon/__pycache__/main.cpython-312.pyc b/app/amazon/__pycache__/main.cpython-312.pyc index 702fd9b5266223f58b6fb523a824642bf08bd99a..e5f9bdadb57b1b737022f09e0e8975f52047f90f 100644 GIT binary patch delta 4782 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 delta 4241 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 diff --git a/app/assets/delete-brand.js b/app/assets/delete-brand.js index 4c1fe87..36c4f8f 100644 --- a/app/assets/delete-brand.js +++ b/app/assets/delete-brand.js @@ -1 +1 @@ -import{d as Ae,o as Me,J as Re,a as o,c as u,b as Be,B as qe,e as a,F as D,r as Z,t as c,f,K as Ue,L as ke,n as me,g as p,h as L,M as He,i as A,E as v,j as Je,N as Ke,O as Oe,P as Le,Q as je,_ as Ve,q as ze,s as Ge}from"./pywebview-Dee3nQjE.js";const Qe={class:"page-shell module-page"},Xe={class:"main-content"},We={class:"left-panel"},Ye={class:"upload-zone"},Ze={class:"selected-files clean-placeholder split-selected-files"},es={key:0,class:"more-line"},ss={key:1},ts={class:"run-row"},ns=["disabled"],as={class:"loading-msg"},ls={key:0,class:"queue-debug-card"},rs={key:0,class:"queue-debug-line"},os={key:1,class:"queue-debug-payload"},us={class:"right-panel"},is={class:"task-list-wrap"},cs={class:"clean-result-summary"},ds={class:"summary-card"},fs={class:"summary-card"},vs={class:"summary-card"},hs={class:"result-list-wrap"},ps={key:0,class:"empty-tasks"},_s={key:0,class:"result-subsection"},gs={class:"task-list clean-result-list"},ys={class:"left split-result-main"},ks=["title"],ms={class:"files"},Is={class:"files"},bs={key:0,class:"files"},ws={key:1,class:"files"},Ss={key:2,class:"files"},Cs={key:3,class:"time"},Ts={key:4,class:"delete-brand-progress-block"},xs={class:"delete-brand-progress-header"},Fs={class:"delete-brand-progress-bar"},Ns={class:"files delete-brand-progress"},$s={key:5,class:"files split-entry-list delete-brand-preview"},Es={key:6,class:"files"},Ps={class:"task-right split-result-actions"},Ds=["onClick"],As=["onClick"],Ms=["onClick"],Rs={key:1,class:"result-subsection"},Bs={class:"task-list clean-result-list"},qs={class:"left split-result-main"},Us=["title"],Hs={class:"files"},Js={class:"files"},Ks={key:0,class:"files"},Os={key:1,class:"files"},Ls={key:2,class:"time"},js={key:3,class:"delete-brand-progress-block"},Vs={class:"delete-brand-progress-header"},zs={class:"delete-brand-progress-bar"},Gs={class:"files delete-brand-progress"},Qs={key:4,class:"files split-entry-list delete-brand-preview"},Xs={key:5,class:"files"},Ws={class:"task-right split-result-actions"},Ys=["onClick"],Zs=["onClick"],et=Ae({__name:"BrandDeleteBrandTab",setup(tt){function F(){return`delete-brand:current-tasks:${typeof window<"u"&&window.localStorage.getItem("uid")||"0"}`}const S=p([]),M=p([]),N=p(!1),ee=p([]),d=p([]),R=p([]),B=p({total:0,successCount:0,failedCount:0,items:[]}),I=p(""),k=p(""),_=p({}),g=p(null),j=p(!1),C=p(!1),T=p(""),q=p(!1),V=L(()=>S.value.slice(0,10)),m=L(()=>{const e=[];return d.value.forEach(s=>{e.push(...s.items)}),e});function Ie(){try{const e=typeof window<"u"?window.localStorage.getItem(F()):null;if(e){if(d.value=JSON.parse(e),d.value.length>0){const s=d.value[d.value.length-1];I.value=s.queuePushResult||"",k.value=s.queuePayloadText||""}}else d.value=[]}catch{d.value=[]}}function se(e,s,t,n){const l=s.filter(h=>h.matchStatus==="MATCHED"&&h.success!==!1);if(l.length===0)return;const i={taskId:e,items:l,createdAt:Date.now(),queuePushResult:t,queuePayloadText:n},r=d.value.findIndex(h=>h.taskId===e);r>=0?d.value[r]=i:d.value.push(i),typeof window<"u"&&window.localStorage.setItem(F(),JSON.stringify(d.value))}function te(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(F(),JSON.stringify(d.value))}const U=L(()=>R.value.filter(e=>!m.value.some(s=>s.taskId===e.taskId||s.resultId&&s.resultId===e.resultId))),be=L(()=>m.value.length>0||U.value.length>0);function ne(){typeof window<"u"&&window.localStorage.setItem(F(),JSON.stringify(d.value))}function $(e){return e?(d.value.find(t=>t.taskId===e)?.items.length||0)>1:!1}function z(e){return e&&d.value.find(s=>s.taskId===e)||null}function G(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=z(e);return t&&t.items.find(n=>G(n,s))||null}function ae(e){if(!e)return!1;const s=z(e);if(!s)return!1;let t=!1;const n=_.value[e]?.line_progress?.info;if($(e)&&n?.finished_files!=null&&n.finished_files>=0){const l=s.items.filter(r=>r._pushed),i=Math.max(0,Math.min(n.finished_files,l.length));for(let r=0;r0&&n.current_line>=n.total_lines){const l=m.value.find(r=>P(r)===T.value),i=l&&l.taskId===e?x(e,l):s.items.find(r=>r.sourceFilename===n.file_name);i&&!i._completed&&(i._completed=!0,t=!0)}return t&&ne(),t}function we(e){return e&&_.value[e]?.task?.status||""}function H(e){if(e.error)return e.error;if(e.matchStatus&&e.matchStatus!=="MATCHED")return e.matchMessage||"";const s=e.taskId;return s&&_.value[s]?.task?.errorMessage||""}function le(e){const s=e.taskId;if(!s)return!1;const t=_.value[s]?.line_progress,n=$(s),l=w(e);return l==="本文件解析完毕"||l==="已被全局判定为终态"?!1:n?x(s,e)?._pushed?t?.has_progress&&t?.info?.file_name?t.info.file_name===e.sourceFilename:!0:!1:t?.has_progress||t?.info?!0:l==="已入队"||l==="处理中"}function re(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 oe(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 Se(){ee.value=[...m.value,...U.value]}function b(){Se(),Ce(ee.value)}function Ce(e){B.value={total:e.length,successCount:e.filter(s=>s.success).length,failedCount:e.filter(s=>!s.success).length,items:e}}function ue(e){if(!e)return"";const s=_.value[e],t=s?.line_progress?.info;if(!s?.line_progress?.has_progress||!t){const l=s?.task?.status;return l?`任务状态:${l}`:""}const n=[];if(t.phase&&n.push(`阶段:${t.phase}`),t.file_index&&t.file_total&&n.push(`文件:${t.file_index}/${t.file_total}`),t.file_name&&n.push(`当前文件:${t.file_name}`),t.current_line!=null&&t.total_lines!=null&&n.push(`${$(e)?"当前文件进度":"进度"}:${t.current_line}/${t.total_lines}`),t.current_country&&n.push(`国家:${t.current_country}`),t.current_asin&&n.push(`ASIN:${t.current_asin}`),t.finished_files!=null){const l=t.file_total&&t.file_total>0?`/${t.file_total}`:"";n.push(`已完成文件:${t.finished_files}${l}`)}return n.join("|")}function J(e){if(!e)return 0;const s=_.value[e]?.line_progress?.info;return s?s.current_line!=null&&s.total_lines&&s.total_lines>0?Math.max(0,Math.min(100,Math.round(s.current_line/s.total_lines*100))):s.finished_files!=null&&s.file_total&&s.file_total>0?Math.max(0,Math.min(100,Math.round(s.finished_files/s.file_total*100))):_.value[e]?.task?.status==="SUCCESS"?100:0:0}function ie(e){const s=_.value[e]?.task?.status;return s==="SUCCESS"||s==="FAILED"}function E(){const e=new Set;return d.value.forEach(s=>{s.items.some(t=>t._pushed)&&e.add(s.taskId)}),Array.from(e)}function w(e){const s=e.taskId;if(!s||!z(s))return"";const n=x(s,e),l=we(s),i=_.value[s]?.line_progress,r=$(s);if(!r&&(l==="SUCCESS"||l==="FAILED"||e.taskStatus==="SUCCESS"||e.taskStatus==="FAILED"))return"已被全局判定为终态";if(r&&!n?._pushed&&!n?._completed)return"未入队";if(n?._completed)return"本文件解析完毕";if(l==="RUNNING"&&i?.has_progress&&i?.info?.file_name===e.sourceFilename)return"处理中";if(r&&l==="SUCCESS")return"本文件解析完毕";if(!r){const h=_.value[s];if(h?.items&&h.items.find(Y=>G(Y,e))&&l==="SUCCESS")return"本文件解析完毕"}return n?._pushed?"已入队":"未入队"}function ce(e){if(e.downloadUrl)return!0;const s=e.taskId;return s?_.value[s]?.task?.status==="SUCCESS":!1}function Te(e){const s=e?.task?.id;if(!s||!e?.items?.length)return!1;const t=d.value.find(r=>r.taskId===s);if(!t)return!1;let n=!1;const i=t.items.map(r=>{const h=e.items?.find(Y=>G(Y,r));if(!h)return r;const y={...r,...h,success:r.success??h.success,_pushed:r._pushed,_completed:r._completed};return JSON.stringify(y)!==JSON.stringify(r)&&(n=!0),y}).filter(r=>r.matchStatus==="MATCHED"&&r.success!==!1);return JSON.stringify(i)!==JSON.stringify(t.items)&&(t.items=i,n=!0),n&&ne(),n}async function Q(e){const s=e||E();if(s.length)try{const t=await He(s);let n=!1;for(const l of t.items||[]){const i=l?.task?.id;typeof i=="number"&&i>0&&(_.value[i]=l,Te(l)&&(n=!0),ae(i)&&(n=!0))}n&&b()}catch{}}function xe(){return document.visibilityState==="visible"?4500:1e4}function X(e=!1){if(g.value){if(!e)return;clearTimeout(g.value),g.value=null}const s=async()=>{if(g.value=null,j.value){X();return}const t=E();if(!t.length)return;j.value=!0;let n=!1;try{await Q(t),await Pe();for(const l of t)ie(l)&&(te(l),n=!0)}finally{j.value=!1}n&&(O(),b()),E().length>0&&X()};e?s():g.value=window.setTimeout(s,xe())}function W(e=!1){g.value&&!e||X(e)}function K(e){const s=e.taskId?_.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 de(){g.value&&(window.clearTimeout(g.value),g.value=null)}async function fe(e){const s=A();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const n of e){const l=typeof n=="string"?n:n.absolutePath,i=typeof n=="string"?void 0:n.relativePath,r=await s.upload_file_to_java(l,i);if(!r?.success||!r.data)throw new Error(r?.error||r?.message||`上传失败:${l}`);t.push(r.data)}return t}async function Fe(){const e=A();if(!e?.select_brand_xlsx_files){v.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await e.select_brand_xlsx_files();if(!s?.length)return;S.value=s,M.value=await fe(s),v.success(`已选择 ${s.length} 个删除品牌文件`)}catch(s){v.error(s instanceof Error?s.message:"选择失败")}}async function Ne(){const e=A();if(!e?.select_brand_folder){v.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await e.select_brand_folder();if(!s)return;const t=await Je(s);if(!t.success||!t.items?.length){v.warning(t.error||"该文件夹下没有 xlsx 文件");return}S.value=t.items.map(n=>n.relativePath||n.absolutePath),M.value=await fe(t.items),v.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`)}catch(s){v.error(s instanceof Error?s.message:"选择失败")}}async function $e(){if(!M.value.length){v.warning("请先选择待处理文件");return}try{N.value=!0;const e=await Ke({files:M.value.map(l=>({fileKey:l.fileKey,originalFilename:l.originalFilename,relativePath:l.relativePath}))}),s=re(e.items||[]),t=s.some(l=>l.matchStatus==="MATCHED"),n=s.some(l=>l.matchStatus&&l.matchStatus!=="MATCHED");I.value="解析完成,等待手动点击打开紫鸟进行单任务处理",k.value="",s.length&&s[0].taskId&&se(s[0].taskId,s,I.value,k.value),b(),n?v.warning("部分文件尚未命中可用店铺索引,已保留状态信息,请等待后台刷新后重试。"):t?v.success("删除品牌解析完成,请手动推送"):v.warning("当前没有可推送的已匹配文件,请先等待店铺索引刷新。"),await O()}catch(e){v.error(e instanceof Error?e.message:"执行失败")}finally{N.value=!1}}async function ve(e){const s=e.taskId;if(!s){v.warning("未找到任务ID");return}const t=A(),n=Oe(s),l=e.outputFilename||e.sourceFilename||`delete-brand_${s}.xlsx`;if(t?.save_file_from_url){const i=await t.save_file_from_url(n,l);i.success?v.success(`已保存:${i.path||l}`):i.error&&i.error!=="用户取消"&&v.error(i.error);return}window.open(n,"_blank")}async function O(){try{const e=await Le();R.value=re(e.items||[]),b(),await Q(),W(!0)}catch(e){console.error("loadHistory error:",e)}}function he(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(F(),JSON.stringify(d.value)),R.value=R.value.filter(t=>t.resultId!==e),b(),E().length===0&&de()}async function pe(e){try{await je(e),he(e),await O(),v.success("已删除")}catch(s){const t=s instanceof Error?s.message:"删除失败";if(typeof t=="string"&&t.includes("记录不存在")){he(e),v.success("已删除");return}v.error(t)}}function _e(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 nt(e,s){}function ge(){for(const e of d.value)for(const s of e.items){const t=w(s);if(t==="已入队"||t==="处理中")return!0}return!1}function P(e){return e.resultId!=null?`result:${e.resultId}`:`task:${e.taskId||0}:${e.sourceFilename||""}`}function Ee(){return m.value.find(e=>!e.openStoreUrl||P(e)===T.value||x(e.taskId,e)?._completed?!1:w(e)==="未入队")}async function ye(e,s){if(s?.auto&&ge())return e.taskId,e.sourceFilename,!1;const t=A(),n=e.taskId;if(!n)return!1;const l=d.value.find(y=>y.taskId===n);if(!l)return!1;if(!t?.enqueue_json)return v.error("当前环境未启用 pywebview enqueue_json(浏览器环境不会推送)"),!1;const i={type:"delete-brand-run",ts:Date.now(),data:{taskId:n,items:[e]}};k.value=JSON.stringify(i,null,2);const r=await t.enqueue_json(i);let h="";if(r?.success){h=`已推送文件 ${e.sourceFilename},当前队列长度:${r.queue_size??"-"}`;const y=x(n,e);y&&(y._pushed=!0,y._completed=!1),T.value=P(e),se(n,l.items,h,k.value),W(!0)}else h=`推送到 Python 队列失败:${r?.error||"未知错误"}`;return I.value=h,!!r?.success}async function Pe(){if(!C.value||q.value){C.value,q.value;return}if(ge())return;const e=T.value;if(e){const t=m.value.find(n=>P(n)===e);if(t){const n=t.taskId,l=$(n);l&&(ae(n),w(t),void 0);const i=w(t);if(i==="已入队"||i==="处理中"){t.sourceFilename;return}if(l){const r=x(n,t);if(r&&!r._completed){t.sourceFilename,r._pushed,r._completed;return}}}}const s=Ee();if(!s){T.value="",C.value=!1;return}q.value=!0;try{s.taskId,s.sourceFilename,P(s),await ye(s,{auto:!0})||(s.taskId,s.sourceFilename,C.value=!1)}finally{q.value=!1}}async function De(e){C.value=!0,await ye(e)||(C.value=!1,T.value="")}return Me(()=>{Ie();const e=E();e.length>0?Q(e).then(()=>{let s=!1;for(const t of e)ie(t)&&(te(t),s=!0);s&&b(),W(!0)}):b(),O().catch(()=>{})}),Re(()=>{de()}),(e,s)=>(o(),u("div",Qe,[Be(qe,{active:"delete-brand"}),a("div",Xe,[a("aside",We,[s[2]||(s[2]=a("div",{class:"section-title"},"选择文件",-1)),a("div",Ye,[s[0]||(s[0]=a("div",{class:"hint"},"上传删除品牌 Excel;无论是直接上传文件还是上传文件夹批量导入,都会按每个 Excel 文件名作为店铺名。",-1)),a("div",{class:"btns"},[a("button",{type:"button",class:"opt-btn",onClick:Fe},"选择 Excel 文件"),a("button",{type:"button",class:"opt-btn",onClick:Ne},"选择文件夹")]),a("div",Ze,[S.value.length?(o(),u(D,{key:0},[(o(!0),u(D,null,Z(V.value,t=>(o(),u("span",{key:t},c(t),1))),128)),S.value.length>V.value.length?(o(),u("span",es," 还有 "+c(S.value.length-V.value.length)+" 个文件未展开显示 ",1)):f("",!0)],64)):(o(),u("span",ss,"暂未选择删除品牌文件"))])]),s[3]||(s[3]=Ue('
执行说明
',2)),a("div",ts,[a("button",{type:"button",class:"btn-run",disabled:N.value,onClick:$e},c(N.value?"解析中...":"开始解析"),9,ns),a("span",as,c(N.value?"正在读取删除品牌数据,请稍候…":"解析后会在右侧展示按国家分组的去重结果"),1)]),I.value||k.value?(o(),u("div",ls,[s[1]||(s[1]=a("div",{class:"section-title queue-debug-title"},"Python 队列推送结果",-1)),I.value?(o(),u("div",rs,c(I.value),1)):f("",!0),k.value?(o(),u("pre",os,c(k.value),1)):f("",!0)])):f("",!0)]),a("section",us,[s[12]||(s[12]=a("div",{class:"panel-header"},"删除品牌结果",-1)),a("div",is,[a("div",cs,[a("div",ds,[s[4]||(s[4]=a("span",{class:"summary-label"},"已处理文件",-1)),a("strong",null,c(B.value.total),1)]),a("div",fs,[s[5]||(s[5]=a("span",{class:"summary-label"},"成功结果",-1)),a("strong",null,c(B.value.successCount),1)]),a("div",vs,[s[6]||(s[6]=a("span",{class:"summary-label"},"失败文件",-1)),a("strong",null,c(B.value.failedCount),1)])]),a("div",hs,[s[11]||(s[11]=a("div",{class:"result-list-header"},[a("span",null,"删除品牌结果列表")],-1)),be.value?(o(),u(D,{key:1},[m.value.length?(o(),u("div",_s,[s[8]||(s[8]=a("div",{class:"result-subsection-title"},"当前任务",-1)),a("ul",gs,[(o(!0),u(D,null,Z(m.value,t=>(o(),u("li",{key:`current-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[a("div",ys,[a("span",{class:"id",title:t.sourceFilename},c(t.sourceFilename||"-"),9,ks),a("div",ms,"店铺名:"+c(t.shopName||"-"),1),a("div",Is,"匹配结果:"+c(oe(t)),1),t.platform?(o(),u("div",bs,"平台:"+c(t.platform),1)):f("",!0),w(t)?(o(),u("div",ws,"队列状态:"+c(w(t)),1)):f("",!0),t.countryCount!==void 0&&t.matched?(o(),u("div",Ss,"国家数:"+c(t.countryCount),1)):f("",!0),t.totalRows!==void 0&&t.matched?(o(),u("div",Cs,"去重后 "+c(t.totalRows)+" 条 ",1)):f("",!0),le(t)?(o(),u("div",Ts,[a("div",xs,[s[7]||(s[7]=a("span",null,"任务进度",-1)),a("span",null,c(J(t.taskId))+"%",1)]),a("div",Fs,[a("div",{class:"delete-brand-progress-bar-fill",style:ke({width:`${J(t.taskId)}%`})},null,4)]),a("div",Ns,c(ue(t.taskId)),1)])):f("",!0),t.previewRows?.length?(o(),u("div",$s,c(_e(t.previewRows)),1)):f("",!0),H(t)?(o(),u("div",Es,"错误信息:"+c(H(t)),1)):f("",!0)]),a("div",Ps,[a("span",{class:me(["status",K(t).className])},c(K(t).text),3),t.openStoreUrl?(o(),u("button",{key:0,type:"button",class:"download",onClick:n=>De(t)}," 打开紫鸟 ",8,Ds)):f("",!0),ce(t)?(o(),u("button",{key:1,type:"button",class:"download",onClick:n=>ve(t)}," 下载 ",8,As)):f("",!0),t.resultId?(o(),u("button",{key:2,type:"button",class:"btn-delete",onClick:n=>pe(t.resultId)}," 删除 ",8,Ms)):f("",!0)])]))),128))])])):f("",!0),U.value.length?(o(),u("div",Rs,[s[10]||(s[10]=a("div",{class:"result-subsection-title"},"历史记录",-1)),a("ul",Bs,[(o(!0),u(D,null,Z(U.value,t=>(o(),u("li",{key:`history-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[a("div",qs,[a("span",{class:"id",title:t.sourceFilename},c(t.sourceFilename||"-"),9,Us),a("div",Hs,"店铺名:"+c(t.shopName||"-"),1),a("div",Js,"匹配结果:"+c(oe(t)),1),t.platform?(o(),u("div",Ks,"平台:"+c(t.platform),1)):f("",!0),t.countryCount!==void 0&&t.matched?(o(),u("div",Os,"国家数:"+c(t.countryCount),1)):f("",!0),t.totalRows!==void 0&&t.matched?(o(),u("div",Ls,"去重后 "+c(t.totalRows)+" 条 ",1)):f("",!0),le(t)?(o(),u("div",js,[a("div",Vs,[s[9]||(s[9]=a("span",null,"任务进度",-1)),a("span",null,c(J(t.taskId))+"%",1)]),a("div",zs,[a("div",{class:"delete-brand-progress-bar-fill",style:ke({width:`${J(t.taskId)}%`})},null,4)]),a("div",Gs,c(ue(t.taskId)),1)])):f("",!0),t.previewRows?.length?(o(),u("div",Qs,c(_e(t.previewRows)),1)):f("",!0),H(t)?(o(),u("div",Xs,"错误信息:"+c(H(t)),1)):f("",!0)]),a("div",Ws,[a("span",{class:me(["status",K(t).className])},c(K(t).text),3),ce(t)?(o(),u("button",{key:0,type:"button",class:"download",onClick:n=>ve(t)}," 下载 ",8,Ys)):f("",!0),t.resultId?(o(),u("button",{key:1,type:"button",class:"btn-delete",onClick:n=>pe(t.resultId)}," 删除 ",8,Zs)):f("",!0)])]))),128))])])):f("",!0)],64)):(o(),u("div",ps," 暂无删除品牌结果,完成解析后会在这里展示按国家分组的去重结果 "))])])])])]))}}),st=Ve(et,[["__scopeId","data-v-7fbcf490"]]);ze(st).use(Ge).mount("#app"); +import{d as Me,o as Ae,J as Be,a as u,c as i,b as qe,B as Ue,e as r,F as R,r as Z,t as c,f,K as Ke,L as Ie,n as be,g as p,h as j,M as He,i as M,E as h,j as Je,N as Oe,O as Le,P as je,Q as Ve,_ as ze,q as Ge,s as Qe}from"./pywebview-Dee3nQjE.js";const Xe={class:"page-shell module-page"},We={class:"main-content"},Ye={class:"left-panel"},Ze={class:"upload-zone"},es={class:"selected-files clean-placeholder split-selected-files"},ss={key:0,class:"more-line"},ts={key:1},ns={class:"run-row"},as=["disabled"],ls={class:"loading-msg"},rs={key:0,class:"queue-debug-card"},os={key:0,class:"queue-debug-line"},us={key:1,class:"queue-debug-payload"},is={class:"right-panel"},cs={class:"task-list-wrap"},ds={class:"clean-result-summary"},fs={class:"summary-card"},vs={class:"summary-card"},hs={class:"summary-card"},ps={class:"result-list-wrap"},_s={key:0,class:"empty-tasks"},gs={key:0,class:"result-subsection"},ys={class:"task-list clean-result-list"},ks={class:"left split-result-main"},ms=["title"],Is={class:"files"},bs={class:"files"},ws={key:0,class:"files"},Ss={key:1,class:"files"},Cs={key:2,class:"files"},Fs={key:3,class:"time"},Ts={key:4,class:"delete-brand-progress-block"},xs={class:"delete-brand-progress-header"},Ns={class:"delete-brand-progress-bar"},$s={class:"files delete-brand-progress"},Es={key:5,class:"files split-entry-list delete-brand-preview"},Ps={key:6,class:"files"},Ds={class:"task-right split-result-actions"},Rs=["onClick"],Ms=["onClick"],As=["onClick"],Bs={key:1,class:"result-subsection"},qs={class:"task-list clean-result-list"},Us={class:"left split-result-main"},Ks=["title"],Hs={class:"files"},Js={class:"files"},Os={key:0,class:"files"},Ls={key:1,class:"files"},js={key:2,class:"time"},Vs={key:3,class:"delete-brand-progress-block"},zs={class:"delete-brand-progress-header"},Gs={class:"delete-brand-progress-bar"},Qs={class:"files delete-brand-progress"},Xs={key:4,class:"files split-entry-list delete-brand-preview"},Ws={key:5,class:"files"},Ys={class:"task-right split-result-actions"},Zs=["onClick"],et=["onClick"],st=Me({__name:"BrandDeleteBrandTab",setup(nt){function N(){return`delete-brand:current-tasks:${typeof window<"u"&&window.localStorage.getItem("uid")||"0"}`}const C=p([]),A=p([]),$=p(!1),ee=p([]),d=p([]),B=p([]),q=p({total:0,successCount:0,failedCount:0,items:[]}),I=p(""),k=p(""),_=p({}),y=p(null),V=p(!1),F=p(!1),b=p(""),U=p(!1),z=j(()=>C.value.slice(0,10)),m=j(()=>{const e=[];return d.value.forEach(s=>{e.push(...s.items)}),e});function we(){try{const e=typeof window<"u"?window.localStorage.getItem(N()):null;if(e){if(d.value=JSON.parse(e),d.value.length>0){const s=d.value[d.value.length-1];I.value=s.queuePushResult||"",k.value=s.queuePayloadText||""}}else d.value=[]}catch{d.value=[]}}function se(e,s,t,n){const l=s.filter(v=>v.matchStatus==="MATCHED"&&v.success!==!1);if(l.length===0)return;const o={taskId:e,items:l,createdAt:Date.now(),queuePushResult:t,queuePayloadText:n},a=d.value.findIndex(v=>v.taskId===e);a>=0?d.value[a]=o:d.value.push(o),typeof window<"u"&&window.localStorage.setItem(N(),JSON.stringify(d.value))}function te(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(N(),JSON.stringify(d.value))}const K=j(()=>B.value.filter(e=>!m.value.some(s=>s.taskId===e.taskId||s.resultId&&s.resultId===e.resultId))),Se=j(()=>m.value.length>0||K.value.length>0);function ne(){typeof window<"u"&&window.localStorage.setItem(N(),JSON.stringify(d.value))}function E(e){return e?(d.value.find(t=>t.taskId===e)?.items.length||0)>1:!1}function G(e){return e&&d.value.find(s=>s.taskId===e)||null}function Q(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 T(e,s){const t=G(e);return t&&t.items.find(n=>Q(n,s))||null}function ae(e){if(!e)return!1;const s=G(e);if(!s)return!1;let t=!1;const n=_.value[e]?.line_progress?.info;if(E(e)&&n?.finished_files!=null&&n.finished_files>=0){const l=s.items.filter(a=>a._pushed),o=Math.max(0,Math.min(n.finished_files,l.length));for(let a=0;a0&&n.current_line>=n.total_lines){const l=m.value.find(a=>x(a)===b.value),o=l&&l.taskId===e?T(e,l):s.items.find(a=>a.sourceFilename===n.file_name);o&&!o._completed&&(o._completed=!0,t=!0)}return t&&ne(),t}function le(e){return e&&_.value[e]?.task?.status||""}function H(e){if(e.error)return e.error;if(e.matchStatus&&e.matchStatus!=="MATCHED")return e.matchMessage||"";const s=e.taskId;return s&&_.value[s]?.task?.errorMessage||""}function re(e){const s=e.taskId;if(!s)return!1;const t=_.value[s]?.line_progress,n=le(s),l=E(s),o=S(e);if(l){const a=T(s,e),v=x(e)===b.value,g=!!(t?.has_progress&&t?.info?.file_name===e.sourceFilename);return!!(v||g||a?._pushed||(n==="RUNNING"||n==="PENDING"||!n)&&a?._completed)}return o==="本文件解析完毕"||o==="已被全局判定为终态"?!1:t?.has_progress||t?.info?!0:o==="已入队"||o==="处理中"}function oe(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 ue(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 Ce(){ee.value=[...m.value,...K.value]}function w(){Ce(),Fe(ee.value)}function Fe(e){q.value={total:e.length,successCount:e.filter(s=>s.success).length,failedCount:e.filter(s=>!s.success).length,items:e}}function ie(e){const s=e.taskId;return s&&(_.value[s]?.fileProgress||[]).find(l=>l.fileKey&&e.fileKey?l.fileKey===e.fileKey:l.sourceFilename&&e.sourceFilename?l.sourceFilename===e.sourceFilename:!1)||null}function ce(e){const s=e.taskId;if(!s)return"";const t=_.value[s],n=t?.line_progress?.info,l=ie(e);if(l){const a=[],v=l.processedRows??0,g=l.totalRows??0;if(l.status&&a.push(`文件状态:${l.status}`),a.push(`文件进度:${v}/${g}`),n?.finished_files!=null){const D=n.file_total&&n.file_total>0?`/${n.file_total}`:"";a.push(`已完成文件:${n.finished_files}${D}`)}return n?.phase&&a.push(`阶段:${n.phase}`),a.join("|")}if(!t?.line_progress?.has_progress||!n){const a=t?.task?.status;return a?`任务状态:${a}`:""}const o=[];if(n.phase&&o.push(`阶段:${n.phase}`),n.file_index&&n.file_total&&o.push(`文件:${n.file_index}/${n.file_total}`),n.file_name&&o.push(`当前文件:${n.file_name}`),n.current_line!=null&&n.total_lines!=null&&o.push(`${E(s)?"当前文件进度":"进度"}:${n.current_line}/${n.total_lines}`),n.current_country&&o.push(`国家:${n.current_country}`),n.current_asin&&o.push(`ASIN:${n.current_asin}`),n.finished_files!=null){const a=n.file_total&&n.file_total>0?`/${n.file_total}`:"";o.push(`已完成文件:${n.finished_files}${a}`)}return o.join("|")}function J(e){const s=e.taskId;if(!s)return 0;const t=ie(e);if(t)return Math.max(0,Math.min(100,t.percent??0));const n=_.value[s]?.line_progress?.info;return n?n.current_line!=null&&n.total_lines&&n.total_lines>0?Math.max(0,Math.min(100,Math.round(n.current_line/n.total_lines*100))):n.finished_files!=null&&n.file_total&&n.file_total>0?Math.max(0,Math.min(100,Math.round(n.finished_files/n.file_total*100))):_.value[s]?.task?.status==="SUCCESS"?100:0:0}function de(e){const s=_.value[e]?.task?.status;return s==="SUCCESS"||s==="FAILED"}function P(){const e=new Set;return d.value.forEach(s=>{s.items.some(t=>t._pushed)&&e.add(s.taskId)}),Array.from(e)}function S(e){const s=e.taskId;if(!s||!G(s))return"";const n=T(s,e),l=le(s),o=_.value[s]?.line_progress,a=E(s);if(!a&&(l==="SUCCESS"||l==="FAILED"||e.taskStatus==="SUCCESS"||e.taskStatus==="FAILED"))return"已被全局判定为终态";if(n?._completed)return"本文件解析完毕";if(l==="RUNNING"&&o?.has_progress&&o?.info?.file_name===e.sourceFilename)return"处理中";if(a&&!n?._pushed&&!n?._completed)return"未入队";if(a&&l==="SUCCESS")return"本文件解析完毕";if(!a){const v=_.value[s];if(v?.items&&v.items.find(D=>Q(D,e))&&l==="SUCCESS")return"本文件解析完毕"}return n?._pushed?"已入队":"未入队"}function fe(e){if(e.downloadUrl)return!0;const s=e.taskId;return s?_.value[s]?.task?.status==="SUCCESS":!1}function Te(e){const s=e?.task?.id;if(!s||!e?.items?.length)return!1;const t=d.value.find(a=>a.taskId===s);if(!t)return!1;let n=!1;const o=t.items.map(a=>{const v=e.items?.find(D=>Q(D,a));if(!v)return a;const g={...a,...v,success:a.success??v.success,_pushed:a._pushed,_completed:a._completed};return JSON.stringify(g)!==JSON.stringify(a)&&(n=!0),g}).filter(a=>a.matchStatus==="MATCHED"&&a.success!==!1);return JSON.stringify(o)!==JSON.stringify(t.items)&&(t.items=o,n=!0),n&&ne(),n}async function X(e){const s=e||P();if(s.length)try{const t=await He(s);let n=!1;for(const l of t.items||[]){const o=l?.task?.id;typeof o=="number"&&o>0&&(_.value[o]=l,Te(l)&&(n=!0),ae(o)&&(n=!0))}n&&w()}catch{}}function xe(){return document.visibilityState==="visible"?4500:1e4}function W(e=!1){if(y.value){if(!e)return;clearTimeout(y.value),y.value=null}const s=async()=>{if(y.value=null,V.value){W();return}const t=P();if(!t.length)return;V.value=!0;let n=!1;try{await X(t),await De();for(const l of t)de(l)&&(te(l),n=!0)}finally{V.value=!1}n&&(L(),w()),P().length>0&&W()};e?s():y.value=window.setTimeout(s,xe())}function Y(e=!1){y.value&&!e||W(e)}function O(e){const s=e.taskId?_.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 ve(){y.value&&(window.clearTimeout(y.value),y.value=null)}async function he(e){const s=M();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const n of e){const l=typeof n=="string"?n:n.absolutePath,o=typeof n=="string"?void 0:n.relativePath,a=await s.upload_file_to_java(l,o);if(!a?.success||!a.data)throw new Error(a?.error||a?.message||`上传失败:${l}`);t.push(a.data)}return t}async function Ne(){const e=M();if(!e?.select_brand_xlsx_files){h.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await e.select_brand_xlsx_files();if(!s?.length)return;C.value=s,A.value=await he(s),h.success(`已选择 ${s.length} 个删除品牌文件`)}catch(s){h.error(s instanceof Error?s.message:"选择失败")}}async function $e(){const e=M();if(!e?.select_brand_folder){h.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await e.select_brand_folder();if(!s)return;const t=await Je(s);if(!t.success||!t.items?.length){h.warning(t.error||"该文件夹下没有 xlsx 文件");return}C.value=t.items.map(n=>n.relativePath||n.absolutePath),A.value=await he(t.items),h.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`)}catch(s){h.error(s instanceof Error?s.message:"选择失败")}}async function Ee(){if(!A.value.length){h.warning("请先选择待处理文件");return}try{$.value=!0;const e=await Oe({files:A.value.map(l=>({fileKey:l.fileKey,originalFilename:l.originalFilename,relativePath:l.relativePath}))}),s=oe(e.items||[]),t=s.some(l=>l.matchStatus==="MATCHED"),n=s.some(l=>l.matchStatus&&l.matchStatus!=="MATCHED");I.value="解析完成,等待手动点击打开紫鸟进行单任务处理",k.value="",s.length&&s[0].taskId&&se(s[0].taskId,s,I.value,k.value),w(),n?h.warning("部分文件尚未命中可用店铺索引,已保留状态信息,请等待后台刷新后重试。"):t?h.success("删除品牌解析完成,请手动推送"):h.warning("当前没有可推送的已匹配文件,请先等待店铺索引刷新。"),await L()}catch(e){h.error(e instanceof Error?e.message:"执行失败")}finally{$.value=!1}}async function pe(e){const s=e.taskId;if(!s){h.warning("未找到任务ID");return}const t=M(),n=Le(s),l=e.outputFilename||e.sourceFilename||`delete-brand_${s}.xlsx`;if(t?.save_file_from_url){const o=await t.save_file_from_url(n,l);o.success?h.success(`已保存:${o.path||l}`):o.error&&o.error!=="用户取消"&&h.error(o.error);return}window.open(n,"_blank")}async function L(){try{const e=await je();B.value=oe(e.items||[]),w(),await X(),Y(!0)}catch(e){console.error("loadHistory error:",e)}}function _e(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(N(),JSON.stringify(d.value)),B.value=B.value.filter(t=>t.resultId!==e),w(),P().length===0&&ve()}async function ge(e){try{await Ve(e),_e(e),await L(),h.success("已删除")}catch(s){const t=s instanceof Error?s.message:"删除失败";if(typeof t=="string"&&t.includes("记录不存在")){_e(e),h.success("已删除");return}h.error(t)}}function ye(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 at(e,s){}function ke(){for(const e of d.value)for(const s of e.items){const t=S(s);if(t==="已入队"||t==="处理中")return!0}return!1}function x(e){return e.resultId!=null?`result:${e.resultId}`:`task:${e.taskId||0}:${e.sourceFilename||""}`}function Pe(){return m.value.find(e=>!e.openStoreUrl||x(e)===b.value||T(e.taskId,e)?._completed?!1:S(e)==="未入队")}async function me(e,s){if(s?.auto&&ke())return e.taskId,e.sourceFilename,!1;const t=M(),n=e.taskId;if(!n)return!1;const l=d.value.find(g=>g.taskId===n);if(!l)return!1;if(!t?.enqueue_json)return h.error("当前环境未启用 pywebview enqueue_json(浏览器环境不会推送)"),!1;const o={type:"delete-brand-run",ts:Date.now(),data:{taskId:n,items:[e]}};k.value=JSON.stringify(o,null,2);const a=await t.enqueue_json(o);let v="";if(a?.success){v=`已推送文件 ${e.sourceFilename},当前队列长度:${a.queue_size??"-"}`;const g=T(n,e);g&&(g._pushed=!0,g._completed=!1),b.value=x(e),se(n,l.items,v,k.value),Y(!0)}else v=`推送到 Python 队列失败:${a?.error||"未知错误"}`;return I.value=v,!!a?.success}async function De(){if(!F.value||U.value){F.value,U.value;return}if(ke())return;const e=b.value;if(e){const t=m.value.find(n=>x(n)===e);if(t){const n=t.taskId,l=E(n);l&&(ae(n),S(t),void 0);const o=S(t);if(o==="已入队"||o==="处理中"){t.sourceFilename;return}if(l){const a=T(n,t);if(a&&!a._completed){t.sourceFilename,a._pushed,a._completed;return}}}}const s=Pe();if(!s){b.value="",F.value=!1;return}U.value=!0;try{s.taskId,s.sourceFilename,x(s),await me(s,{auto:!0})||(s.taskId,s.sourceFilename,F.value=!1)}finally{U.value=!1}}async function Re(e){F.value=!0,await me(e)||(F.value=!1,b.value="")}return Ae(()=>{we();const e=P();e.length>0?X(e).then(()=>{let s=!1;for(const t of e)de(t)&&(te(t),s=!0);s&&w(),Y(!0)}):w(),L().catch(()=>{})}),Be(()=>{ve()}),(e,s)=>(u(),i("div",Xe,[qe(Ue,{active:"delete-brand"}),r("div",We,[r("aside",Ye,[s[2]||(s[2]=r("div",{class:"section-title"},"选择文件",-1)),r("div",Ze,[s[0]||(s[0]=r("div",{class:"hint"},"上传删除品牌 Excel;无论是直接上传文件还是上传文件夹批量导入,都会按每个 Excel 文件名作为店铺名。",-1)),r("div",{class:"btns"},[r("button",{type:"button",class:"opt-btn",onClick:Ne},"选择 Excel 文件"),r("button",{type:"button",class:"opt-btn",onClick:$e},"选择文件夹")]),r("div",es,[C.value.length?(u(),i(R,{key:0},[(u(!0),i(R,null,Z(z.value,t=>(u(),i("span",{key:t},c(t),1))),128)),C.value.length>z.value.length?(u(),i("span",ss," 还有 "+c(C.value.length-z.value.length)+" 个文件未展开显示 ",1)):f("",!0)],64)):(u(),i("span",ts,"暂未选择删除品牌文件"))])]),s[3]||(s[3]=Ke('
执行说明
',2)),r("div",ns,[r("button",{type:"button",class:"btn-run",disabled:$.value,onClick:Ee},c($.value?"解析中...":"开始解析"),9,as),r("span",ls,c($.value?"正在读取删除品牌数据,请稍候…":"解析后会在右侧展示按国家分组的去重结果"),1)]),I.value||k.value?(u(),i("div",rs,[s[1]||(s[1]=r("div",{class:"section-title queue-debug-title"},"Python 队列推送结果",-1)),I.value?(u(),i("div",os,c(I.value),1)):f("",!0),k.value?(u(),i("pre",us,c(k.value),1)):f("",!0)])):f("",!0)]),r("section",is,[s[12]||(s[12]=r("div",{class:"panel-header"},"删除品牌结果",-1)),r("div",cs,[r("div",ds,[r("div",fs,[s[4]||(s[4]=r("span",{class:"summary-label"},"已处理文件",-1)),r("strong",null,c(q.value.total),1)]),r("div",vs,[s[5]||(s[5]=r("span",{class:"summary-label"},"成功结果",-1)),r("strong",null,c(q.value.successCount),1)]),r("div",hs,[s[6]||(s[6]=r("span",{class:"summary-label"},"失败文件",-1)),r("strong",null,c(q.value.failedCount),1)])]),r("div",ps,[s[11]||(s[11]=r("div",{class:"result-list-header"},[r("span",null,"删除品牌结果列表")],-1)),Se.value?(u(),i(R,{key:1},[m.value.length?(u(),i("div",gs,[s[8]||(s[8]=r("div",{class:"result-subsection-title"},"当前任务",-1)),r("ul",ys,[(u(!0),i(R,null,Z(m.value,t=>(u(),i("li",{key:`current-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[r("div",ks,[r("span",{class:"id",title:t.sourceFilename},c(t.sourceFilename||"-"),9,ms),r("div",Is,"店铺名:"+c(t.shopName||"-"),1),r("div",bs,"匹配结果:"+c(ue(t)),1),t.platform?(u(),i("div",ws,"平台:"+c(t.platform),1)):f("",!0),S(t)?(u(),i("div",Ss,"队列状态:"+c(S(t)),1)):f("",!0),t.countryCount!==void 0&&t.matched?(u(),i("div",Cs,"国家数:"+c(t.countryCount),1)):f("",!0),t.totalRows!==void 0&&t.matched?(u(),i("div",Fs,"去重后 "+c(t.totalRows)+" 条 ",1)):f("",!0),re(t)?(u(),i("div",Ts,[r("div",xs,[s[7]||(s[7]=r("span",null,"任务进度",-1)),r("span",null,c(J(t))+"%",1)]),r("div",Ns,[r("div",{class:"delete-brand-progress-bar-fill",style:Ie({width:`${J(t)}%`})},null,4)]),r("div",$s,c(ce(t)),1)])):f("",!0),t.previewRows?.length?(u(),i("div",Es,c(ye(t.previewRows)),1)):f("",!0),H(t)?(u(),i("div",Ps,"错误信息:"+c(H(t)),1)):f("",!0)]),r("div",Ds,[r("span",{class:be(["status",O(t).className])},c(O(t).text),3),t.openStoreUrl?(u(),i("button",{key:0,type:"button",class:"download",onClick:n=>Re(t)}," 打开紫鸟 ",8,Rs)):f("",!0),fe(t)?(u(),i("button",{key:1,type:"button",class:"download",onClick:n=>pe(t)}," 下载 ",8,Ms)):f("",!0),t.resultId?(u(),i("button",{key:2,type:"button",class:"btn-delete",onClick:n=>ge(t.resultId)}," 删除 ",8,As)):f("",!0)])]))),128))])])):f("",!0),K.value.length?(u(),i("div",Bs,[s[10]||(s[10]=r("div",{class:"result-subsection-title"},"历史记录",-1)),r("ul",qs,[(u(!0),i(R,null,Z(K.value,t=>(u(),i("li",{key:`history-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[r("div",Us,[r("span",{class:"id",title:t.sourceFilename},c(t.sourceFilename||"-"),9,Ks),r("div",Hs,"店铺名:"+c(t.shopName||"-"),1),r("div",Js,"匹配结果:"+c(ue(t)),1),t.platform?(u(),i("div",Os,"平台:"+c(t.platform),1)):f("",!0),t.countryCount!==void 0&&t.matched?(u(),i("div",Ls,"国家数:"+c(t.countryCount),1)):f("",!0),t.totalRows!==void 0&&t.matched?(u(),i("div",js,"去重后 "+c(t.totalRows)+" 条 ",1)):f("",!0),re(t)?(u(),i("div",Vs,[r("div",zs,[s[9]||(s[9]=r("span",null,"任务进度",-1)),r("span",null,c(J(t))+"%",1)]),r("div",Gs,[r("div",{class:"delete-brand-progress-bar-fill",style:Ie({width:`${J(t)}%`})},null,4)]),r("div",Qs,c(ce(t)),1)])):f("",!0),t.previewRows?.length?(u(),i("div",Xs,c(ye(t.previewRows)),1)):f("",!0),H(t)?(u(),i("div",Ws,"错误信息:"+c(H(t)),1)):f("",!0)]),r("div",Ys,[r("span",{class:be(["status",O(t).className])},c(O(t).text),3),fe(t)?(u(),i("button",{key:0,type:"button",class:"download",onClick:n=>pe(t)}," 下载 ",8,Zs)):f("",!0),t.resultId?(u(),i("button",{key:1,type:"button",class:"btn-delete",onClick:n=>ge(t.resultId)}," 删除 ",8,et)):f("",!0)])]))),128))])])):f("",!0)],64)):(u(),i("div",_s," 暂无删除品牌结果,完成解析后会在这里展示按国家分组的去重结果 "))])])])])]))}}),tt=ze(st,[["__scopeId","data-v-7f166b99"]]);Ge(tt).use(Qe).mount("#app"); diff --git a/app/new_web_source/delete-brand.html b/app/new_web_source/delete-brand.html index fc3da1f..79865d0 100644 --- a/app/new_web_source/delete-brand.html +++ b/app/new_web_source/delete-brand.html @@ -7,7 +7,7 @@ - +
diff --git a/backend-java/aiimage-backend.log.2026-04-02.0.gz b/backend-java/aiimage-backend.log.2026-04-02.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..5fef1dda184f075e2f9f4209204959f96a068479 GIT binary patch literal 26282 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 !9qp(QuFONo|JQb~ZtFYR1)MY=tIwqhUzFDdJ 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 literal 0 HcmV?d00001 diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/model/vo/DeleteBrandTaskDetailVo.java b/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/model/vo/DeleteBrandTaskDetailVo.java index 9bf9829..b60ca27 100644 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/model/vo/DeleteBrandTaskDetailVo.java +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/model/vo/DeleteBrandTaskDetailVo.java @@ -17,4 +17,7 @@ public class DeleteBrandTaskDetailVo { @Schema(description = "任务结果项快照") private List items = new ArrayList<>(); + + @Schema(description = "文件级进度快照") + private List fileProgress = new ArrayList<>(); } diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/model/vo/DeleteBrandTaskFileProgressVo.java b/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/model/vo/DeleteBrandTaskFileProgressVo.java new file mode 100644 index 0000000..0c0a024 --- /dev/null +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/model/vo/DeleteBrandTaskFileProgressVo.java @@ -0,0 +1,27 @@ +package com.nanri.aiimage.modules.deletebrand.model.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "删除品牌任务中的文件级进度") +public class DeleteBrandTaskFileProgressVo { + + @Schema(description = "文件标识(优先 fileKey)") + private String fileKey; + + @Schema(description = "源文件名") + private String sourceFilename; + + @Schema(description = "已处理行数") + private Integer processedRows; + + @Schema(description = "总行数") + private Integer totalRows; + + @Schema(description = "百分比(0-100)") + private Integer percent; + + @Schema(description = "文件状态:PENDING/RUNNING/COMPLETED/FAILED") + private String status; +} diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java b/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java index 75fee5d..9152476 100644 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/deletebrand/service/DeleteBrandRunService.java @@ -25,6 +25,7 @@ import com.nanri.aiimage.modules.deletebrand.model.vo.DeleteBrandResultItemVo; import com.nanri.aiimage.modules.deletebrand.model.vo.DeleteBrandRunVo; import com.nanri.aiimage.modules.deletebrand.model.vo.DeleteBrandTaskDeletionStatusVo; import com.nanri.aiimage.modules.deletebrand.model.vo.DeleteBrandTaskDetailVo; +import com.nanri.aiimage.modules.deletebrand.model.vo.DeleteBrandTaskFileProgressVo; import com.nanri.aiimage.modules.deletebrand.model.vo.DeleteBrandTaskItemVo; import com.nanri.aiimage.modules.file.service.LocalFileStorageService; import com.nanri.aiimage.modules.file.service.oss.OssStorageService; @@ -569,9 +570,11 @@ public class DeleteBrandRunService { DeleteBrandLineProgressVo progressVo = buildLineProgress(task.getId(), progress); DeleteBrandTaskDetailVo detail = new DeleteBrandTaskDetailVo(); + List taskItems = resolveTaskResultItems(task); detail.setTask(taskVo); detail.setLine_progress(progressVo); - detail.setItems(resolveTaskResultItems(task)); + detail.setItems(taskItems); + detail.setFileProgress(buildFileProgress(task, taskItems, progressVo)); return detail; } @@ -602,6 +605,73 @@ public class DeleteBrandRunService { } } + private List buildFileProgress(FileTaskEntity task, + List taskItems, + DeleteBrandLineProgressVo progressVo) { + if (taskItems == null || taskItems.isEmpty()) { + return List.of(); + } + + String taskStatus = task == null ? null : task.getStatus(); + DeleteBrandLineProgressInfoVo info = progressVo == null ? null : progressVo.getInfo(); + Integer finishedFiles = info == null ? null : info.getFinished_files(); + String runningFileName = info == null ? null : info.getFile_name(); + Integer currentLine = info == null ? null : info.getCurrent_line(); + Integer totalLines = info == null ? null : info.getTotal_lines(); + + List fileProgress = new ArrayList<>(); + int completedAssigned = 0; + int normalizedFinished = finishedFiles == null ? 0 : Math.max(0, finishedFiles); + + for (DeleteBrandResultItemVo item : taskItems) { + if (item == null) { + continue; + } + + DeleteBrandTaskFileProgressVo fp = new DeleteBrandTaskFileProgressVo(); + fp.setFileKey(item.getFileKey()); + fp.setSourceFilename(item.getSourceFilename()); + + Integer itemTotalRows = item.getTotalRows() == null ? 0 : Math.max(item.getTotalRows(), 0); + fp.setTotalRows(itemTotalRows); + + String status = "PENDING"; + int processedRows = 0; + int percent = 0; + + if ("SUCCESS".equals(taskStatus)) { + status = "COMPLETED"; + processedRows = itemTotalRows; + percent = 100; + } else if ("FAILED".equals(taskStatus)) { + status = "FAILED"; + processedRows = Math.min(itemTotalRows, Math.max(0, currentLine == null ? 0 : currentLine)); + percent = itemTotalRows > 0 ? Math.min(100, (int) Math.round(processedRows * 100.0 / itemTotalRows)) : 0; + } else { + if (completedAssigned < normalizedFinished) { + status = "COMPLETED"; + processedRows = itemTotalRows; + percent = 100; + completedAssigned++; + } else if (runningFileName != null && runningFileName.equals(item.getSourceFilename())) { + status = "RUNNING"; + processedRows = Math.min(itemTotalRows, Math.max(0, currentLine == null ? 0 : currentLine)); + if (totalLines != null && totalLines > 0) { + percent = Math.min(100, Math.max(0, (int) Math.round(processedRows * 100.0 / totalLines))); + } else if (itemTotalRows > 0) { + percent = Math.min(100, Math.max(0, (int) Math.round(processedRows * 100.0 / itemTotalRows))); + } + } + } + + fp.setProcessedRows(processedRows); + fp.setPercent(percent); + fp.setStatus(status); + fileProgress.add(fp); + } + return fileProgress; + } + private FileTaskEntity refreshIndexedMatchesIfNeeded(FileTaskEntity task) { if (task == null || task.getResultJson() == null || task.getResultJson().isBlank()) { return task; diff --git a/frontend-vue/src/pages/brand/components/BrandDeleteBrandTab.vue b/frontend-vue/src/pages/brand/components/BrandDeleteBrandTab.vue index 631f37a..07f3cb5 100644 --- a/frontend-vue/src/pages/brand/components/BrandDeleteBrandTab.vue +++ b/frontend-vue/src/pages/brand/components/BrandDeleteBrandTab.vue @@ -115,13 +115,13 @@
任务进度 - {{ formatProgressPercent(item.taskId!) }}% + {{ formatProgressPercent(item) }}%
+ :style="{ width: `${formatProgressPercent(item)}%` }">
-
{{ formatProgress(item.taskId!) }}
+
{{ formatProgress(item) }}
{{ formatPreview(item.previewRows) }} @@ -167,13 +167,13 @@
任务进度 - {{ formatProgressPercent(item.taskId!) }}% + {{ formatProgressPercent(item) }}%
+ :style="{ width: `${formatProgressPercent(item)}%` }">
-
{{ formatProgress(item.taskId!) }}
+
{{ formatProgress(item) }}
{{ formatPreview(item.previewRows) }} @@ -421,25 +421,30 @@ function shouldShowProgress(item: DeleteBrandResultItem) { if (!taskId) return false const progress = taskDetails.value[taskId]?.line_progress + const status = getTaskStatus(taskId) const multiFileTask = isMultiFileTask(taskId) const qs = getQueueStatus(item) - // 已完成/终态后隐藏进度条。 - if (qs === '本文件解析完毕' || qs === '已被全局判定为终态') { + if (multiFileTask) { + const sessionItem = findSessionItem(taskId, item) + const isActiveItem = getItemKey(item) === activeItemKey.value + const isProgressTarget = Boolean(progress?.has_progress && progress?.info?.file_name === item.sourceFilename) + + // 多文件任务下,展示规则更宽松: + // 1) 当前活跃文件;2) 后端进度指向的文件;3) 已推送文件;4) 已完成文件(任务未终态时保留)。 + if (isActiveItem || isProgressTarget || sessionItem?._pushed) { + return true + } + if ((status === 'RUNNING' || status === 'PENDING' || !status) && sessionItem?._completed) { + return true + } + return false } - if (multiFileTask) { - const sessionItem = findSessionItem(taskId, item) - // 多文件任务:未入队的文件不展示同一个 task 的公共进度,避免“两个文件同时在跑”的错觉。 - if (!sessionItem?._pushed) { - return false - } - - if (progress?.has_progress && progress?.info?.file_name) { - return progress.info.file_name === item.sourceFilename - } - return true + // 单文件任务:完成/终态后隐藏。 + if (qs === '本文件解析完毕' || qs === '已被全局判定为终态') { + return false } if (progress?.has_progress || progress?.info) { @@ -507,10 +512,40 @@ function updateSummary(items: DeleteBrandResultItem[]) { } } -function formatProgress(taskId: number) { +function getFileProgress(item: DeleteBrandResultItem) { + const taskId = item.taskId + if (!taskId) return null + const detail = taskDetails.value[taskId] + const fileProgress = detail?.fileProgress || [] + return fileProgress.find((fp) => { + if (fp.fileKey && item.fileKey) return fp.fileKey === item.fileKey + if (fp.sourceFilename && item.sourceFilename) return fp.sourceFilename === item.sourceFilename + return false + }) || null +} + +function formatProgress(item: DeleteBrandResultItem) { + const taskId = item.taskId if (!taskId) return '' + const detail = taskDetails.value[taskId] const info = detail?.line_progress?.info + const fp = getFileProgress(item) + + if (fp) { + const parts: string[] = [] + const processedRows = fp.processedRows ?? 0 + const totalRows = fp.totalRows ?? 0 + if (fp.status) parts.push(`文件状态:${fp.status}`) + parts.push(`文件进度:${processedRows}/${totalRows}`) + if (info?.finished_files != null) { + const total = info.file_total && info.file_total > 0 ? `/${info.file_total}` : '' + parts.push(`已完成文件:${info.finished_files}${total}`) + } + if (info?.phase) parts.push(`阶段:${info.phase}`) + return parts.join('|') + } + if (!detail?.line_progress?.has_progress || !info) { const status = detail?.task?.status return status ? `任务状态:${status}` : '' @@ -532,8 +567,15 @@ function formatProgress(taskId: number) { return parts.join('|') } -function formatProgressPercent(taskId: number) { +function formatProgressPercent(item: DeleteBrandResultItem) { + const taskId = item.taskId if (!taskId) return 0 + + const fp = getFileProgress(item) + if (fp) { + return Math.max(0, Math.min(100, fp.percent ?? 0)) + } + const info = taskDetails.value[taskId]?.line_progress?.info if (!info) return 0 @@ -578,20 +620,21 @@ function getQueueStatus(item: DeleteBrandResultItem) { return '已被全局判定为终态' } - // 多文件:未推送的文件必须保持“未入队”,避免被同 task 的公共 RUNNING 状态误判成“处理中”。 - if (multiFileTask && !sessionItem?._pushed && !sessionItem?._completed) { - return '未入队' - } - // 先看前端会话态:一旦该文件已判定完成,优先展示完成,避免被 RUNNING 覆盖导致链式推进卡住。 if (sessionItem?._completed) { return '本文件解析完毕' } + // 多文件场景下,如果后端进度明确指向当前文件,即使本地 _pushed 丢失也应判定为处理中(例如刷新页面后恢复场景)。 if (status === 'RUNNING' && info?.has_progress && info?.info?.file_name === item.sourceFilename) { return '处理中' } + // 多文件:未推送且未完成,才视为未入队。 + if (multiFileTask && !sessionItem?._pushed && !sessionItem?._completed) { + return '未入队' + } + if (multiFileTask && status === 'SUCCESS') { return '本文件解析完毕' } diff --git a/frontend-vue/src/shared/api/java-modules.ts b/frontend-vue/src/shared/api/java-modules.ts index 3f93ae2..73124d4 100644 --- a/frontend-vue/src/shared/api/java-modules.ts +++ b/frontend-vue/src/shared/api/java-modules.ts @@ -200,10 +200,20 @@ export interface DeleteBrandTaskItem { downloadFilename?: string } +export interface DeleteBrandTaskFileProgress { + fileKey?: string + sourceFilename?: string + processedRows?: number + totalRows?: number + percent?: number + status?: 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED' +} + export interface DeleteBrandTaskDetailVo { task: DeleteBrandTaskItem line_progress: DeleteBrandLineProgress items?: DeleteBrandResultItem[] + fileProgress?: DeleteBrandTaskFileProgress[] } export interface DeleteBrandTaskBatchVo {