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