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