2 lines
12 KiB
JavaScript
2 lines
12 KiB
JavaScript
import { d as G, o as M, a as i, c as r, b as O, B as Q, e as t, F as x, r as I, t as c, f as y, n as S, w as W, u as Y, x as ee, g as p, h as D, y as te, i as h, E as l, j as se, z as ae, A as le, C as ne, D as oe, G as ie, H as re, I as ce, J as ue, _ as de, q as pe, s as ve } from "./pywebview-BnpJyyGZ.js"; const fe = { class: "page-shell module-page" }, me = { class: "main-content" }, _e = { class: "left-panel" }, ye = { class: "upload-zone" }, he = { class: "selected-files clean-placeholder" }, we = { key: 0, class: "more-line" }, ge = { key: 1 }, be = { class: "option-group" }, Ce = ["value"], ke = { class: "template-item-content" }, xe = { class: "label" }, Te = { key: 0, class: "template-tag" }, Ee = { key: 1, class: "template-tag muted" }, Fe = { key: 2, class: "template-tag custom" }, Ie = { class: "desc" }, De = { key: 0, class: "empty-option" }, Be = { class: "template-actions" }, $e = ["disabled"], Ue = ["disabled"], Ne = ["disabled"], Se = { class: "template-actions-hint" }, Re = { class: "option-group" }, Pe = { class: "radio-item active" }, ze = { class: "desc" }, He = { class: "run-row" }, Ve = ["disabled"], Ae = { class: "loading-msg" }, Xe = { class: "right-panel" }, je = { class: "task-list-wrap" }, Ke = { class: "clean-result-summary" }, Ze = { class: "summary-card" }, Je = { class: "summary-card" }, Le = { class: "summary-card" }, qe = { class: "result-list-wrap" }, Ge = { key: 0, class: "empty-tasks" }, Me = { key: 1, class: "task-list clean-result-list" }, Oe = { class: "left" }, Qe = ["title"], We = { key: 0, class: "files" }, Ye = { key: 1, class: "files" }, et = { class: "task-right" }, tt = ["onClick"], st = ["onClick"], at = G({ __name: "BrandConvertTab", setup(nt) { const f = p([]), T = p([]), m = p(!1), w = p([]), _ = p({ total: 0, successCount: 0, failedCount: 0, items: [] }), v = p([]), u = p(""), g = p(!1), b = p(!1), C = p(!1), B = p(), E = D(() => f.value.slice(0, 8)), d = D(() => v.value.find(a => a.id === u.value) || null), R = D(() => !!(d.value && !d.value.builtIn)); async function P(a) { const e = h(); if (!e?.upload_file_to_java) throw new Error("当前桌面端未提供文件上传桥接能力"); const s = []; for (const n of a) { const o = await e.upload_file_to_java(n); if (!o?.success || !o.data) throw new Error(o?.error || o?.message || `上传失败:${n}`); s.push(o.data) } return s } async function k(a) { const e = await te(); if (v.value = e || [], a && v.value.some(o => o.id === a)) { u.value = a; return } const s = v.value.find(o => o.id === u.value); if (s) { u.value = s.id; return } const n = v.value.find(o => o.isDefault); if (n) { u.value = n.id; return } u.value = v.value[0]?.id || "" } async function $(a, e) { f.value = a, T.value = await P(a), l.success(e) } async function z() { const a = h(); if (!a?.select_brand_xlsx_files) { l.warning("当前环境不支持文件选择,请在本机客户端中打开"); return } try { const e = await a.select_brand_xlsx_files(); if (!e?.length) return; await $(e, `已选择 ${e.length} 个待转换文件`) } catch (e) { l.error(e instanceof Error ? e.message : "选择失败") } } async function H() { const a = h(); if (!a?.select_brand_folder) { l.warning("当前环境不支持文件夹选择,请在本机客户端中打开"); return } try { const e = await a.select_brand_folder(); if (!e) return; const s = await se(e); if (s.success && s.paths?.length) { await $(s.paths, `已选择文件夹内 ${s.paths.length} 个 xlsx 文件`); return } l.warning(s.error || "该文件夹下没有 xlsx 文件") } catch (e) { l.error(e instanceof Error ? e.message : "选择失败") } } function V() { B.value?.click() } async function A(a) { const e = a.target, s = e.files?.[0]; if (e.value = "", !!s) try { g.value = !0; const n = await s.text(), o = s.name.replace(/\.[^.]+$/, "") || s.name, N = await ae({ templateName: o, templateContent: n }); await k(N.id), l.success(`模板已上传:${N.templateName}`) } catch (n) { l.error(n instanceof Error ? n.message : "模板上传失败") } finally { g.value = !1 } } async function X() { if (!d.value) { l.warning("请先选择模板"); return } try { b.value = !0, await le(d.value.templateCode || d.value.id), await k(d.value.id), l.success("默认模板已更新") } catch (a) { l.error(a instanceof Error ? a.message : "设置默认模板失败") } finally { b.value = !1 } } async function j() { if (!d.value) { l.warning("请先选择模板"); return } if (d.value.builtIn) { l.warning("内置模板不允许删除"); return } try { C.value = !0, await ne(d.value.templateCode || d.value.id); const a = d.value.id; await k(), u.value === a && (u.value = v.value[0]?.id || ""), l.success("模板已删除") } catch (a) { l.error(a instanceof Error ? a.message : "删除模板失败") } finally { C.value = !1 } } async function U(a, e, s) { const n = h(); if (s && n?.[s]) { const o = await n[s](); o.success ? l.success(`已保存:${o.path || e}`) : o.error && o.error !== "用户取消" && l.error(o.error); return } if (n?.save_file_from_url) { const o = await n.save_file_from_url(a, e); o.success ? l.success(`已保存:${o.path || e}`) : o.error && o.error !== "用户取消" && l.error(o.error); return } window.open(a, "_blank") } async function K() { await U(ce(), "品牌文档格式_模板.xlsx", "save_template_xlsx") } async function Z() { await U(ue(), "模板2-以文件夹方式上传.zip", "save_template_zip") } async function J() { if (!T.value.length) { l.warning("请先选择待转换 Excel 文件或文件夹"); return } if (!u.value) { l.warning("请先选择模板"); return } try { m.value = !0; const a = await oe({ files: T.value.map(e => ({ fileKey: e.fileKey, originalFilename: e.originalFilename })), templateId: u.value }); _.value = a, w.value = a.items || [], await F(), l.success("格式转换完成") } catch (a) { l.error(a instanceof Error ? a.message : "格式转换失败") } finally { m.value = !1 } } async function F() { try { const a = await ie(); w.value = a.items || [], _.value = { total: a.items?.length || 0, successCount: a.items?.filter(e => e.success).length || 0, failedCount: a.items?.filter(e => !e.success).length || 0, items: a.items || [] } } catch { } } async function L(a) { try { await re(a), await F(), l.success("已删除") } catch (e) { l.error(e instanceof Error ? e.message : "删除失败") } } async function q(a) { const e = h(); if (!a.downloadUrl) { l.warning("当前结果没有下载地址"); return } const s = a.outputFilename || `${new Date().toISOString().slice(0, 10).replace(/-/g, "")}.txt`; if (e?.save_file_from_url) { const n = await e.save_file_from_url(a.downloadUrl, s); n.success ? l.success(`已保存:${n.path || s}`) : n.error && n.error !== "用户取消" && l.error(n.error); return } window.open(a.downloadUrl, "_blank") } return M(() => { k().catch(() => { }), F().catch(() => { }) }), (a, e) => (i(), r("div", fe, [O(Q, { active: "convert" }), t("div", me, [t("aside", _e, [e[7] || (e[7] = t("div", { class: "section-title" }, "选择文件", -1)), t("div", ye, [e[1] || (e[1] = t("div", { class: "hint" }, "选择需要转换的 Excel 文件或文件夹,将按所选模板生成 txt 文件。", -1)), t("div", { class: "btns" }, [t("button", { type: "button", class: "opt-btn", onClick: z }, "选择 Excel 文件"), t("button", { type: "button", class: "opt-btn", onClick: H }, "选择文件夹")]), t("div", he, [f.value.length ? (i(), r(x, { key: 0 }, [(i(!0), r(x, null, I(E.value, s => (i(), r("span", { key: s }, c(s), 1))), 128)), f.value.length > E.value.length ? (i(), r("span", we, " 还有 " + c(f.value.length - E.value.length) + " 个文件未展开显示 ", 1)) : y("", !0)], 64)) : (i(), r("span", ge, "暂未选择待转换文件"))])]), e[8] || (e[8] = t("div", { class: "section-title" }, "模板选择", -1)), t("div", be, [(i(!0), r(x, null, I(v.value, s => (i(), r("label", { key: s.id, class: S(["radio-item", { active: u.value === s.id }]) }, [W(t("input", { "onUpdate:modelValue": e[0] || (e[0] = n => u.value = n), type: "radio", value: s.id, name: "convert-template" }, null, 8, Ce), [[Y, u.value]]), t("div", ke, [t("div", null, [t("span", xe, [ee(c(s.templateName) + " ", 1), s.isDefault ? (i(), r("span", Te, "默认")) : s.builtIn ? (i(), r("span", Ee, "内置")) : (i(), r("span", Fe, "自定义"))]), t("div", Ie, "输出文件:" + c(s.outputFilename), 1)])])], 2))), 128)), v.value.length ? y("", !0) : (i(), r("div", De, "暂无可用模板"))]), e[9] || (e[9] = t("div", { class: "section-title" }, "模板管理", -1)), t("div", Be, [t("button", { type: "button", class: "opt-btn", disabled: g.value, onClick: V }, c(g.value ? "上传中..." : "上传 txt 模板"), 9, $e), t("button", { type: "button", class: "opt-btn small", disabled: b.value, onClick: X }, c(b.value ? "设置中..." : "设为默认模板"), 9, Ue), t("button", { type: "button", class: "opt-btn small danger", disabled: !R.value || C.value, onClick: j }, c(C.value ? "删除中..." : "删除当前模板"), 9, Ne), t("input", { ref_key: "templateInputRef", ref: B, type: "file", accept: ".txt,text/plain", class: "hidden-file-input", onChange: A }, null, 544), t("div", Se, " 当前模板:" + c(d.value?.templateName || "未加载模板"), 1)]), e[10] || (e[10] = t("div", { class: "section-title" }, "模板示例", -1)), t("div", { class: "template-download-list" }, [t("button", { type: "button", class: "template-download-row", onClick: K }, [...e[2] || (e[2] = [t("span", { class: "template-download-icon", "aria-hidden": "true" }, "XLSX", -1), t("span", { class: "template-download-text" }, [t("span", { class: "title" }, "下载 Excel 模板示例"), t("span", { class: "hint" }, "品牌文档格式_模板.xlsx")], -1)])]), t("button", { type: "button", class: "template-download-row", onClick: Z }, [...e[3] || (e[3] = [t("span", { class: "template-download-icon", "aria-hidden": "true" }, "ZIP", -1), t("span", { class: "template-download-text" }, [t("span", { class: "title" }, "下载文件夹示例"), t("span", { class: "hint" }, "模板2-以文件夹方式上传.zip")], -1)])])]), e[11] || (e[11] = t("div", { class: "section-title" }, "转换说明", -1)), t("div", Re, [t("label", Pe, [e[5] || (e[5] = t("input", { type: "checkbox", checked: "", disabled: "" }, null, -1)), t("div", null, [e[4] || (e[4] = t("span", { class: "label" }, "按当前模板输出", -1)), t("div", ze, "当前模板:" + c(d.value?.templateName || "未加载模板"), 1)])]), e[6] || (e[6] = t("label", { class: "radio-item active" }, [t("input", { type: "checkbox", checked: "", disabled: "" }), t("div", null, [t("span", { class: "label" }, "SKU 使用雪花ID-序号"), t("div", { class: "desc" }, "例如 1773816146796-1")])], -1))]), t("div", He, [t("button", { type: "button", class: "btn-run", disabled: m.value, onClick: J }, c(m.value ? "转换中..." : "开始转换"), 9, Ve), t("span", Ae, c(m.value ? "正在生成并上传结果,请稍候…" : "选择文件后即可执行格式转换,结果会显示在右侧供下载"), 1)])]), t("section", Xe, [e[16] || (e[16] = t("div", { class: "panel-header" }, "转换结果", -1)), t("div", je, [t("div", Ke, [t("div", Ze, [e[12] || (e[12] = t("span", { class: "summary-label" }, "已处理文件", -1)), t("strong", null, c(_.value.total), 1)]), t("div", Je, [e[13] || (e[13] = t("span", { class: "summary-label" }, "成功结果", -1)), t("strong", null, c(_.value.successCount), 1)]), t("div", Le, [e[14] || (e[14] = t("span", { class: "summary-label" }, "失败文件", -1)), t("strong", null, c(_.value.failedCount), 1)])]), t("div", qe, [e[15] || (e[15] = t("div", { class: "result-list-header" }, [t("span", null, "生成的 txt 列表")], -1)), w.value.length === 0 ? (i(), r("div", Ge, " 暂无转换结果,完成格式转换后会在这里展示输出文件 ")) : (i(), r("ul", Me, [(i(!0), r(x, null, I(w.value, s => (i(), r("li", { key: `${s.resultId || s.outputFilename || s.sourceFilename}`, class: "task-item" }, [t("div", Oe, [t("span", { class: "id", title: s.sourceFilename }, c(s.sourceFilename || "-"), 9, Qe), s.outputFilename ? (i(), r("div", We, "输出文件:" + c(s.outputFilename), 1)) : s.error ? (i(), r("div", Ye, "错误信息:" + c(s.error), 1)) : y("", !0)]), t("div", et, [t("span", { class: S(["status", s.success ? "success" : "failed"]) }, c(s.success ? "已完成" : "失败"), 3), s.success && s.downloadUrl ? (i(), r("button", { key: 0, type: "button", class: "download", onClick: n => q(s) }, " 下载文件 ", 8, tt)) : y("", !0), s.resultId ? (i(), r("button", { key: 1, type: "button", class: "btn-delete", onClick: n => L(s.resultId) }, " 删除 ", 8, st)) : y("", !0)])]))), 128))]))])])])])])) } }), lt = de(at, [["__scopeId", "data-v-6a58776c"]]); pe(lt).use(ve).mount("#app");
|