2 lines
12 KiB
JavaScript
2 lines
12 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");
|