2 lines
12 KiB
JavaScript
2 lines
12 KiB
JavaScript
import { d as G, o as J, a, c as n, b as L, B as O, e, F as S, r as $, t as i, f as v, n as x, w as k, u as V, D as M, g as d, h as Q, i as F, E as r, j as W, G as X, H as Y, p as Z, v as ss, I as es, _ as ts, q as ls, s as as } from "./pywebview-DdV1XQSM.js"; const ns = { class: "page-shell module-page" }, os = { class: "main-content" }, is = { class: "left-panel" }, rs = { class: "upload-zone" }, us = { class: "selected-files clean-placeholder split-selected-files" }, ds = { key: 0, class: "more-line" }, cs = { key: 1 }, ps = { class: "option-group column-option-group" }, vs = { class: "column-toolbar" }, fs = { class: "column-count" }, _s = { class: "column-actions" }, ms = { key: 0, class: "column-grid" }, ys = ["value"], gs = { key: 1, class: "empty-column-state" }, hs = { class: "option-group" }, bs = { class: "radio-item active" }, ws = { class: "desc" }, ks = { class: "option-group" }, Cs = { class: "option-group" }, Ss = { key: 0, class: "split-input-card" }, xs = { key: 1, class: "split-input-card" }, Fs = { class: "run-row" }, Es = ["disabled"], Ps = { class: "loading-msg" }, $s = { class: "right-panel" }, Bs = { class: "task-list-wrap" }, Is = { class: "clean-result-summary" }, Rs = { class: "summary-card" }, Us = { class: "summary-card" }, Vs = { class: "summary-card" }, Ms = { class: "result-list-wrap" }, Ts = { key: 0, class: "empty-tasks" }, js = { key: 1, class: "task-list clean-result-list" }, Ds = { class: "left split-result-main" }, Hs = ["title"], Ns = { key: 0, class: "files" }, As = { key: 1, class: "time" }, Ks = { key: 2, class: "files" }, zs = { key: 3, class: "files split-entry-list" }, qs = { key: 4, class: "files" }, Gs = { class: "task-right split-result-actions" }, Js = ["onClick"], Ls = ["onClick"], Os = G({ __name: "BrandSplitTab", setup(Ws) { const f = d([]), C = d(""), c = d([]), _ = d([]), p = d([]), B = 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: [] }), E = Q(() => f.value.slice(0, 8)); function T(l) { b.value = { total: l.length, successCount: l.filter(s => s.success).length, failedCount: l.filter(s => !s.success).length, items: l } } async function I(l) { const s = F(); if (!s?.upload_file_to_java) throw new Error("当前桌面端未提供文件上传桥接能力"); const t = []; for (const o of l) { const U = typeof o == "string" ? o : o.absolutePath, q = typeof o == "string" ? void 0 : o.relativePath, w = await s.upload_file_to_java(U, q); if (!w?.success || !w.data) throw new Error(w?.error || w?.message || `上传失败:${U}`); t.push(w.data) } return t } async function R(l) { const s = await Z(l); _.value = s.headers || [], p.value = [...s.headers || []], B.value = s.totalRows || 0 } async function j(l, s) { f.value = l, C.value = "", c.value = await I(l), c.value.length > 0 && await R(c.value[0].fileKey), r.success(s) } async function D() { const l = F(); if (!l?.select_brand_xlsx_files) { r.warning("当前环境不支持文件选择,请在本机客户端中打开"); return } try { const s = await l.select_brand_xlsx_files(); if (!s?.length) return; await j(s, `已选择 ${s.length} 个待拆分文件`) } catch (s) { r.error(s instanceof Error ? s.message : "选择失败") } } async function H() { const l = F(); 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 W(s); if (t.success && t.items?.length) { f.value = t.items.map(o => o.relativePath), c.value = await I(t.items), c.value.length > 0 && await R(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 N() { 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 X({ 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 Y(); h.value = l.items || [], T(h.value) } catch { } } async function A(l) { try { await es(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 = F(); 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 o = await s.save_file_from_url(l.downloadUrl, t); o.success ? r.success(`已保存:${o.path || t}`) : o.error && o.error !== "用户取消" && r.error(o.error); return } window.open(l.downloadUrl, "_blank") } return J(() => { P().catch(() => { }) }), (l, s) => (a(), n("div", ns, [L(O, { active: "split" }), e("div", os, [e("aside", is, [s[14] || (s[14] = e("div", { class: "section-title" }, "选择文件", -1)), e("div", rs, [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: H }, "选择文件夹")]), e("div", us, [f.value.length ? (a(), n(S, { key: 0 }, [(a(!0), n(S, null, $(E.value, t => (a(), n("span", { key: t }, i(t), 1))), 128)), f.value.length > E.value.length ? (a(), n("span", ds, " 还有 " + i(f.value.length - E.value.length) + " 个文件未展开显示 ", 1)) : v("", !0)], 64)) : (a(), n("span", cs, "暂未选择待拆分文件"))])]), s[15] || (s[15] = e("div", { class: "section-title" }, "保留列设置", -1)), e("div", ps, [e("div", vs, [e("span", fs, "已选择 " + i(p.value.length) + " / " + i(_.value.length) + " 列", 1), e("div", _s, [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", ms, [(a(!0), n(S, null, $(_.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, ys), [[ss, p.value]]), e("span", null, i(t), 1)], 2))), 128))])) : (a(), n("div", gs, "请选择 Excel 文件后读取表头并填充可保留列"))]), s[16] || (s[16] = e("div", { class: "section-title" }, "总条数", -1)), e("div", hs, [e("label", bs, [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", ws, i(B.value) + " 条(不含表头)", 1)])])]), s[17] || (s[17] = e("div", { class: "section-title" }, "拆分模式", -1)), e("div", ks, [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", Cs, [u.value === "rows_per_file" ? (a(), n("label", Ss, [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", xs, [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", Fs, [e("button", { type: "button", class: "btn-run", disabled: g.value, onClick: N }, i(g.value ? "拆分中..." : "开始拆分"), 9, Es), e("span", Ps, i(g.value ? "正在拆分并上传结果,请稍候…" : "选择文件、保留列和拆分规则后即可执行拆分,结果会显示在右侧供下载"), 1)])]), e("section", $s, [s[23] || (s[23] = e("div", { class: "panel-header" }, "拆分结果", -1)), e("div", Bs, [e("div", Is, [e("div", Rs, [s[19] || (s[19] = e("span", { class: "summary-label" }, "已处理文件", -1)), e("strong", null, i(b.value.total), 1)]), e("div", Us, [s[20] || (s[20] = e("span", { class: "summary-label" }, "成功结果", -1)), e("strong", null, i(b.value.successCount), 1)]), e("div", Vs, [s[21] || (s[21] = e("span", { class: "summary-label" }, "失败文件", -1)), e("strong", null, i(b.value.failedCount), 1)])]), e("div", Ms, [s[22] || (s[22] = e("div", { class: "result-list-header" }, [e("span", null, "拆分结果压缩包列表")], -1)), h.value.length === 0 ? (a(), n("div", Ts, " 暂无拆分结果,完成数据拆分后会在这里展示压缩包文件 ")) : (a(), n("ul", js, [(a(!0), n(S, null, $(h.value, t => (a(), n("li", { key: `${t.resultId || t.outputFilename || t.sourceFilename}-${t.rowCount || 0}`, class: "task-item split-result-item" }, [e("div", Ds, [e("span", { class: "id", title: t.sourceFilename }, i(t.sourceFilename || "-"), 9, Hs), t.outputFilename ? (a(), n("div", Ns, "压缩包文件:" + i(t.outputFilename), 1)) : v("", !0), t.rowCount !== void 0 ? (a(), n("div", As, "压缩包共包含 " + i(t.rowCount) + " 条数据", 1)) : v("", !0), t.entryCount && t.entryCount > 0 ? (a(), n("div", Ks, "压缩包内共 " + i(t.entryCount) + " 个拆分文件", 1)) : v("", !0), t.entries && t.entries.length ? (a(), n("div", zs, " 压缩包内容:" + i(K(t.entries)), 1)) : v("", !0), t.error ? (a(), n("div", qs, "错误信息:" + i(t.error), 1)) : v("", !0)]), e("div", Gs, [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: o => z(t) }, " 下载压缩包 ", 8, Js)) : v("", !0), t.resultId ? (a(), n("button", { key: 1, type: "button", class: "btn-delete", onClick: o => A(t.resultId) }, " 删除 ", 8, Ls)) : v("", !0)])]))), 128))]))])])])])])) } }), Qs = ts(Os, [["__scopeId", "data-v-4df71c3f"]]); ls(Qs).use(as).mount("#app");
|