Files
crawler-plugin/app/assets/split.js
2026-03-21 10:00:16 +08:00

2 lines
9.4 KiB
JavaScript

import{d as A,o as K,a,c as n,b as N,B as z,e,F as C,r as $,t as i,f as w,n as x,w as h,u as I,D as R,g as d,h as q,i as S,E as o,j as G,G as J,H as L,p as O,v as Q,I as W,_ as X,q as Y,s as Z}from"./pywebview-Rm5Hhqpf.js";const ss={class:"page-shell module-page"},es={class:"main-content"},ts={class:"left-panel"},ls={class:"upload-zone"},as={class:"selected-files clean-placeholder"},ns={key:0,class:"more-line"},os={key:1},is={class:"option-group column-option-group"},rs={class:"column-toolbar"},us={class:"column-count"},ds={class:"column-actions"},cs={key:0,class:"column-grid"},ps=["value"],vs={key:1,class:"empty-column-state"},_s={class:"option-group"},fs={class:"radio-item active"},ms={class:"desc"},ys={class:"option-group"},bs={class:"option-group"},gs={key:0,class:"split-input-card"},ws={key:1,class:"split-input-card"},hs={class:"run-row"},ks=["disabled"],Cs={class:"loading-msg"},xs={class:"right-panel"},Ss={class:"task-list-wrap"},Fs={class:"clean-result-summary"},Es={class:"summary-card"},$s={class:"summary-card"},Us={class:"summary-card"},Bs={class:"result-list-wrap"},Is={key:0,class:"empty-tasks"},Rs={key:1,class:"task-list clean-result-list"},Ps={class:"left"},Vs=["title"],Ms={key:0,class:"files"},Ts={key:1,class:"time"},Ds={key:2,class:"files"},Hs={class:"task-right"},js=["onClick"],As=["onClick"],Ks=A({__name:"BrandSplitTab",setup(zs){const p=d([]),v=d([]),_=d([]),c=d([]),U=d(0),r=d("rows_per_file"),f=d(2e3),m=d(5),y=d(!1),k=d([]),b=d({total:0,successCount:0,failedCount:0,items:[]}),F=q(()=>p.value.slice(0,8));async function P(l){const s=S();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const u of l){const g=await s.upload_file_to_java(u);if(!g?.success||!g.data)throw new Error(g?.error||g?.message||`上传失败:${u}`);t.push(g.data)}return t}async function V(l){const s=await O(l);_.value=s.headers||[],c.value=[...s.headers||[]],U.value=s.totalRows||0}async function B(l,s){p.value=l,v.value=await P(l),v.value.length>0&&await V(v.value[0].fileKey),o.success(s)}async function M(){const l=S();if(!l?.select_brand_xlsx_files){o.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await l.select_brand_xlsx_files();if(!s?.length)return;await B(s,`已选择 ${s.length} 个待拆分文件`)}catch(s){o.error(s instanceof Error?s.message:"选择失败")}}async function T(){const l=S();if(!l?.select_brand_folder){o.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await l.select_brand_folder();if(!s)return;const t=await G(s);if(t.success&&t.paths?.length){await B(t.paths,`已选择文件夹内 ${t.paths.length} 个 xlsx 文件`);return}o.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(s){o.error(s instanceof Error?s.message:"选择失败")}}async function D(){if(!v.value.length){o.warning("请先选择待拆分 Excel 文件或文件夹");return}if(!c.value.length){o.warning("请至少选择一列保留列");return}if(r.value==="rows_per_file"&&(!f.value||f.value<=0)){o.warning("请输入有效的每份条数");return}if(r.value==="parts"&&(!m.value||m.value<=0)){o.warning("请输入有效的拆分份数");return}try{y.value=!0;const l=await J({files:v.value.map(s=>({fileKey:s.fileKey,originalFilename:s.originalFilename})),selectedColumns:c.value,splitMode:r.value,rowsPerFile:r.value==="rows_per_file"&&f.value||void 0,parts:r.value==="parts"&&m.value||void 0});b.value=l,k.value=l.items||[],await E(),o.success("数据拆分完成")}catch(l){o.error(l instanceof Error?l.message:"数据拆分失败")}finally{y.value=!1}}async function E(){try{const l=await L();k.value=l.items||[],b.value={total:l.items?.length||0,successCount:l.items?.filter(s=>s.success).length||0,failedCount:l.items?.filter(s=>!s.success).length||0,items:l.items||[]}}catch{}}async function H(l){try{await W(l),await E(),o.success("已删除")}catch(s){o.error(s instanceof Error?s.message:"删除失败")}}async function j(l){const s=S();if(!l.downloadUrl){o.warning("当前结果没有下载地址");return}const t=l.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}.xlsx`;if(s?.save_file_from_url){const u=await s.save_file_from_url(l.downloadUrl,t);u.success?o.success(`已保存:${u.path||t}`):u.error&&u.error!=="用户取消"&&o.error(u.error);return}window.open(l.downloadUrl,"_blank")}return K(()=>{E().catch(()=>{})}),(l,s)=>(a(),n("div",ss,[N(z,{active:"split"}),e("div",es,[e("aside",ts,[s[14]||(s[14]=e("div",{class:"section-title"},"选择文件",-1)),e("div",ls,[s[7]||(s[7]=e("div",{class:"hint"},"选择需要拆分的 Excel 文件或文件夹,按规则拆成多个 Excel 文件。",-1)),e("div",{class:"btns"},[e("button",{type:"button",class:"opt-btn",onClick:M},"选择 Excel 文件"),e("button",{type:"button",class:"opt-btn",onClick:T},"选择文件夹")]),e("div",as,[p.value.length?(a(),n(C,{key:0},[(a(!0),n(C,null,$(F.value,t=>(a(),n("span",{key:t},i(t),1))),128)),p.value.length>F.value.length?(a(),n("span",ns," 还有 "+i(p.value.length-F.value.length)+" 个文件未展开显示 ",1)):w("",!0)],64)):(a(),n("span",os,"暂未选择待拆分文件"))])]),s[15]||(s[15]=e("div",{class:"section-title"},"保留列设置",-1)),e("div",is,[e("div",rs,[e("span",us,"已选择 "+i(c.value.length)+" / "+i(_.value.length)+" 列",1),e("div",ds,[e("button",{type:"button",class:"opt-btn small",onClick:s[0]||(s[0]=t=>c.value=[..._.value])},"全选"),e("button",{type:"button",class:"opt-btn small",onClick:s[1]||(s[1]=t=>c.value=[])},"清空")])]),_.value.length?(a(),n("div",cs,[(a(!0),n(C,null,$(_.value,t=>(a(),n("label",{key:t,class:x(["column-item",{active:c.value.includes(t)}])},[h(e("input",{"onUpdate:modelValue":s[2]||(s[2]=u=>c.value=u),type:"checkbox",value:t},null,8,ps),[[Q,c.value]]),e("span",null,i(t),1)],2))),128))])):(a(),n("div",vs,"请选择 Excel 文件后读取表头并填充可保留列"))]),s[16]||(s[16]=e("div",{class:"section-title"},"总条数",-1)),e("div",_s,[e("label",fs,[s[9]||(s[9]=e("input",{type:"checkbox",checked:"",disabled:""},null,-1)),e("div",null,[s[8]||(s[8]=e("span",{class:"label"},"当前数据总条数",-1)),e("div",ms,i(U.value)+" 条(不含表头)",1)])])]),s[17]||(s[17]=e("div",{class:"section-title"},"拆分模式",-1)),e("div",ys,[e("label",{class:x(["radio-item",{active:r.value==="rows_per_file"}])},[h(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>r.value=t),type:"radio",value:"rows_per_file",name:"split-mode"},null,512),[[I,r.value]]),s[10]||(s[10]=e("div",null,[e("span",{class:"label"},"按每份条数"),e("div",{class:"desc"},"例如每份 2000 条,最后一份放剩余数据")],-1))],2),e("label",{class:x(["radio-item",{active:r.value==="parts"}])},[h(e("input",{"onUpdate:modelValue":s[4]||(s[4]=t=>r.value=t),type:"radio",value:"parts",name:"split-mode"},null,512),[[I,r.value]]),s[11]||(s[11]=e("div",null,[e("span",{class:"label"},"按份数平均拆分"),e("div",{class:"desc"},"例如拆 5 份,按总条数尽量平均分配")],-1))],2)]),s[18]||(s[18]=e("div",{class:"section-title"},"拆分参数",-1)),e("div",bs,[r.value==="rows_per_file"?(a(),n("label",gs,[s[12]||(s[12]=e("span",{class:"label"},"每份条数",-1)),h(e("input",{"onUpdate:modelValue":s[5]||(s[5]=t=>f.value=t),class:"split-number-input",type:"number",min:"1",placeholder:"例如 2000"},null,512),[[R,f.value,void 0,{number:!0}]])])):(a(),n("label",ws,[s[13]||(s[13]=e("span",{class:"label"},"拆分份数",-1)),h(e("input",{"onUpdate:modelValue":s[6]||(s[6]=t=>m.value=t),class:"split-number-input",type:"number",min:"1",placeholder:"例如 5"},null,512),[[R,m.value,void 0,{number:!0}]])]))]),e("div",hs,[e("button",{type:"button",class:"btn-run",disabled:y.value,onClick:D},i(y.value?"拆分中...":"开始拆分"),9,ks),e("span",Cs,i(y.value?"正在拆分并上传结果,请稍候…":"选择文件、保留列和拆分规则后即可执行拆分,结果会显示在右侧供下载"),1)])]),e("section",xs,[s[23]||(s[23]=e("div",{class:"panel-header"},"拆分结果",-1)),e("div",Ss,[e("div",Fs,[e("div",Es,[s[19]||(s[19]=e("span",{class:"summary-label"},"已处理文件",-1)),e("strong",null,i(b.value.total),1)]),e("div",$s,[s[20]||(s[20]=e("span",{class:"summary-label"},"成功结果",-1)),e("strong",null,i(b.value.successCount),1)]),e("div",Us,[s[21]||(s[21]=e("span",{class:"summary-label"},"失败文件",-1)),e("strong",null,i(b.value.failedCount),1)])]),e("div",Bs,[s[22]||(s[22]=e("div",{class:"result-list-header"},[e("span",null,"拆分后的 Excel 列表")],-1)),k.value.length===0?(a(),n("div",Is," 暂无拆分结果,完成数据拆分后会在这里展示输出文件 ")):(a(),n("ul",Rs,[(a(!0),n(C,null,$(k.value,t=>(a(),n("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}-${t.rowCount||0}`,class:"task-item"},[e("div",Ps,[e("span",{class:"id",title:t.sourceFilename},i(t.sourceFilename||"-"),9,Vs),t.outputFilename?(a(),n("div",Ms,"输出文件:"+i(t.outputFilename),1)):w("",!0),t.rowCount!==void 0?(a(),n("div",Ts,"包含 "+i(t.rowCount)+" 条数据",1)):t.error?(a(),n("div",Ds,"错误信息:"+i(t.error),1)):w("",!0)]),e("div",Hs,[e("span",{class:x(["status",t.success?"success":"failed"])},i(t.success?"已完成":"失败"),3),t.success&&t.downloadUrl?(a(),n("button",{key:0,type:"button",class:"download",onClick:u=>j(t)}," 下载文件 ",8,js)):w("",!0),t.resultId?(a(),n("button",{key:1,type:"button",class:"btn-delete",onClick:u=>H(t.resultId)}," 删除 ",8,As)):w("",!0)])]))),128))]))])])])])]))}}),Ns=X(Ks,[["__scopeId","data-v-a69b42b2"]]);Y(Ns).use(Z).mount("#app");