You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

296 lines
25 KiB

import { defineComponent, ref, reactive, computed, unref, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderClass } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { L as LANG_OPTIONS } from './useLangOptions-DMhiAuTa.mjs';
import { _ as _export_sfc } from './server.mjs';
import './useLoading-D4zrSa2m.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'pinia';
import 'perfect-debounce';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "meetingsvc",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
const REGIONS = [
{ value: 1, label: "中国" },
{ value: 2, label: "美国" },
{ value: 3, label: "东亚" },
{ value: 4, label: "东南亚" },
{ value: 5, label: "南亚" },
{ value: 6, label: "中东" },
{ value: 7, label: "欧洲" },
{ value: 8, label: "俄罗斯" },
{ value: 9, label: "非洲" },
{ value: 10, label: "南美" },
{ value: 11, label: "北美" },
{ value: 12, label: "大洋洲" },
{ value: 13, label: "巴西" },
{ value: 14, label: "印度" }
];
function regionLabel(v) {
return REGIONS.find((r) => r.value === v)?.label ?? "区域" + v;
}
const apps = ref([]);
const scopeApp = ref("");
const scopeRegion = ref(0);
const items = ref([]);
const available = ref([]);
const kindCats = ref({ "1": [8], "2": [3], "3": [5, 9] });
const llmClientChoice = ref(false);
const isOverride = ref(false);
const loading = ref(false);
const saving = ref(false);
const busy = ref(false);
const probeLang = ref("zh-CN");
ref(null);
ref(null);
const addKind = ref(1);
const addForm = reactive({ svc_id: "", cost_hint: 0, is_default: false, client_visible: false });
const costEdit = reactive({ row_id: 0, name: "", kind: 1, cost_hint: 0 });
function kindLabel(k) {
return k === 1 ? "识别" : k === 2 ? "翻译" : "总结";
}
function costUnit(k) {
return k === 1 ? "元/小时" : k === 2 ? "元/百万字符" : "元/百万token";
}
function langName(code) {
return LANG_OPTIONS.find((o) => o.code === code)?.name ?? code;
}
function catsHas(cats, v) {
return (cats || "").split(",").map((x) => Number(x.trim())).includes(v);
}
const svcMap = computed(() => {
const m = /* @__PURE__ */ new Map();
for (const s of available.value) m.set(s.id, s);
return m;
});
function svcName(id) {
return svcMap.value.get(id)?.name ?? id;
}
function svcProvider(id) {
return svcMap.value.get(id)?.provider ?? "?";
}
function svcLangs(id) {
return svcMap.value.get(id)?.languages ?? "";
}
function isVision(id) {
return catsHas(svcMap.value.get(id)?.categories ?? "", 9);
}
function ofKind(k) {
return items.value.filter((o) => o.kind === k).sort((a, b) => a.priority - b.priority);
}
function addable(k) {
const cats = kindCats.value[String(k)] ?? [];
const used = new Set(items.value.filter((o) => o.kind === k).map((o) => o.svc_id));
return available.value.filter((s) => !used.has(s.id) && s.categories.split(",").some((c) => cats.includes(Number(c.trim()))));
}
function svcSupportsLang(id, lang) {
const ls = svcLangs(id);
if (!ls) return true;
return ls.split(",").map((x) => x.trim()).includes(lang);
}
const asrHit = computed(() => ofKind(1).find((o) => o.enabled && svcSupportsLang(o.svc_id, probeLang.value)) ?? null);
const mtHit = computed(() => ofKind(2).find((o) => o.enabled) ?? null);
function asrSkipped(o) {
return asrHit.value?.row_id !== o.row_id && (!o.enabled || !svcSupportsLang(o.svc_id, probeLang.value));
}
function asrWhyClass(o) {
if (asrHit.value?.row_id === o.row_id) return "ok";
if (!o.enabled || !svcSupportsLang(o.svc_id, probeLang.value)) return "no";
return "";
}
function asrWhy(o) {
if (asrHit.value?.row_id === o.row_id) {
return svcLangs(o.svc_id) ? `✓ 当前源语言(${langName(probeLang.value)})由它承接` : `✓ 未限定语言,先落到它(实际支持由引擎判断)`;
}
if (!o.enabled) return "已停用,跳过";
if (!svcSupportsLang(o.svc_id, probeLang.value)) return `不支持 ${langName(probeLang.value)}(${probeLang.value}),跳过 → 顺延下一个`;
return "备用:前面都跳过时接手";
}
const llmDefault = computed(() => ofKind(3).find((o) => o.is_default) ?? null);
const pickable = computed(() => ofKind(3).filter((o) => o.enabled && o.client_visible));
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-4edbf244><div class="flex items-start justify-between mb-4 flex-wrap gap-3" data-v-4edbf244><div data-v-4edbf244><h2 class="text-lg font-semibold text-slate-800" data-v-4edbf244>会议记录服务</h2><p class="text-xs text-slate-400 mt-1 max-w-3xl" data-v-4edbf244> 识别 / 翻译 / 总结三段,从<b data-v-4edbf244>第三方服务配置</b>里选已配好的服务来编排(不再单独填凭据)。 <span class="text-slate-500" data-v-4edbf244>先配「全局默认」作兜底,再按应用 / 区域覆盖</span>——没配覆盖的应用自动继承全局默认。 </p></div></div><div class="scopebar" data-v-4edbf244><div class="flex items-center gap-2" data-v-4edbf244><span class="text-xs text-slate-500 font-semibold" data-v-4edbf244>作用域</span><select class="select select-bordered select-sm" data-v-4edbf244><option value="" data-v-4edbf244${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认(兜底)</option><!--[-->`);
ssrRenderList(apps.value, (a) => {
_push(`<option${ssrRenderAttr("value", a)} data-v-4edbf244${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>应用:${ssrInterpolate(a)}</option>`);
});
_push(`<!--]--></select><select class="select select-bordered select-sm" data-v-4edbf244><option${ssrRenderAttr("value", 0)} data-v-4edbf244${ssrIncludeBooleanAttr(Array.isArray(scopeRegion.value) ? ssrLooseContain(scopeRegion.value, 0) : ssrLooseEqual(scopeRegion.value, 0)) ? " selected" : ""}>全区域</option><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)} data-v-4edbf244${ssrIncludeBooleanAttr(Array.isArray(scopeRegion.value) ? ssrLooseContain(scopeRegion.value, r.value) : ssrLooseEqual(scopeRegion.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
});
_push(`<!--]--></select></div><span class="text-[11px] text-slate-400" data-v-4edbf244>${ssrInterpolate(scopeApp.value ? `正在编辑「${scopeApp.value}」` : "正在编辑全局默认")}${ssrInterpolate(scopeRegion.value ? ` · ${regionLabel(scopeRegion.value)}` : " · 全区域")} `);
if (isOverride.value) {
_push(`<!--[-->(覆盖全局默认)<!--]-->`);
} else {
_push(`<!---->`);
}
_push(`</span></div>`);
if (loading.value) {
_push(`<div class="bg-white rounded-xl border border-slate-100 py-16 text-center" data-v-4edbf244><span class="loading loading-spinner loading-sm" data-v-4edbf244></span></div>`);
} else {
_push(`<!--[-->`);
if (!available.value.length) {
_push(`<div class="alert alert-warning py-2 text-sm mb-4" data-v-4edbf244><span data-v-4edbf244> 该作用域没有可选服务。先去<b data-v-4edbf244>第三方服务配置</b>添加「录音文件识别 / 机器翻译 / 文本或多媒体大模型」类的服务 (全局默认或该应用作用域),这里才能选。 </span></div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="card" data-v-4edbf244><div class="card-head" data-v-4edbf244><div data-v-4edbf244><div class="card-title" data-v-4edbf244>识别(录音文件转写)</div><div class="card-desc" data-v-4edbf244>按顺序找<b data-v-4edbf244>第一个「已启用 + 支持源语言」</b>的服务,不支持则跳到下一个。把便宜的排前面即&quot;优先用性价比高的&quot;。</div></div><div class="flex gap-2 shrink-0" data-v-4edbf244><button class="btn btn-xs"${ssrIncludeBooleanAttr(ofKind(1).length < 2 || busy.value) ? " disabled" : ""} data-v-4edbf244>⇅ 按参考单价重排</button><button class="btn btn-primary btn-xs text-white"${ssrIncludeBooleanAttr(!addable(1).length) ? " disabled" : ""} data-v-4edbf244>+ 添加识别服务</button></div></div><div class="probe-bar" data-v-4edbf244><span class="text-xs text-slate-500 font-semibold" data-v-4edbf244>选路预览</span><select class="select select-bordered select-xs w-44 text-xs" data-v-4edbf244><!--[-->`);
ssrRenderList(unref(LANG_OPTIONS), (o) => {
_push(`<option${ssrRenderAttr("value", o.code)} data-v-4edbf244${ssrIncludeBooleanAttr(Array.isArray(probeLang.value) ? ssrLooseContain(probeLang.value, o.code) : ssrLooseEqual(probeLang.value, o.code)) ? " selected" : ""}>${ssrInterpolate(o.code)} · ${ssrInterpolate(o.name)}</option>`);
});
_push(`<!--]--></select>`);
if (asrHit.value) {
_push(`<span class="probe-out" data-v-4edbf244>命中 ${ssrInterpolate(svcName(asrHit.value.svc_id))}`);
if (asrHit.value.cost_hint) {
_push(`<!--[--> · ¥${ssrInterpolate(asrHit.value.cost_hint)}/时<!--]-->`);
} else {
_push(`<!---->`);
}
_push(`</span>`);
} else {
_push(`<span class="probe-out bad" data-v-4edbf244>无可用服务 —— ${ssrInterpolate(langName(probeLang.value))} 会转写失败</span>`);
}
_push(`</div>`);
if (!ofKind(1).length) {
_push(`<div class="py-10 text-center text-slate-400 text-sm" data-v-4edbf244>暂无识别服务,点右上「+ 添加识别服务」</div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(ofKind(1), (o, i) => {
_push(`<div class="${ssrRenderClass([{ hit: asrHit.value && asrHit.value.row_id === o.row_id, off: !o.enabled }, "svc asr"])}" data-v-4edbf244><div class="${ssrRenderClass([{ hit: asrHit.value && asrHit.value.row_id === o.row_id }, "svc-rank"])}" data-v-4edbf244>${ssrInterpolate(i + 1)}</div><div class="min-w-0" data-v-4edbf244><div class="${ssrRenderClass([{ skip: asrSkipped(o) }, "svc-name"])}" data-v-4edbf244>${ssrInterpolate(svcName(o.svc_id))}</div><div class="svc-prov" data-v-4edbf244>${ssrInterpolate(svcProvider(o.svc_id))} · ${ssrInterpolate(o.svc_id)}</div></div><div class="flex flex-wrap gap-1" data-v-4edbf244>`);
if (svcLangs(o.svc_id)) {
_push(`<!--[--><!--[-->`);
ssrRenderList(svcLangs(o.svc_id).split(",").slice(0, 5), (l) => {
_push(`<span class="${ssrRenderClass([{ on: l === probeLang.value }, "lang"])}" data-v-4edbf244>${ssrInterpolate(l)}</span>`);
});
_push(`<!--]-->`);
if (svcLangs(o.svc_id).split(",").length > 5) {
_push(`<span class="lang" data-v-4edbf244>+${ssrInterpolate(svcLangs(o.svc_id).split(",").length - 5)}</span>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
} else {
_push(`<span class="text-[11px] text-slate-400" data-v-4edbf244>未限定</span>`);
}
_push(`</div><div class="svc-cost" data-v-4edbf244>`);
if (o.cost_hint) {
_push(`<!--[-->¥${ssrInterpolate(o.cost_hint)}<small data-v-4edbf244> /时</small><!--]-->`);
} else {
_push(`<span class="text-slate-300" data-v-4edbf244>—</span>`);
}
_push(`</div><div data-v-4edbf244><input type="checkbox" class="toggle toggle-success toggle-sm"${ssrIncludeBooleanAttr(o.enabled) ? " checked" : ""}${ssrIncludeBooleanAttr(busy.value) ? " disabled" : ""} data-v-4edbf244></div><div class="svc-acts" data-v-4edbf244><button class="arrow"${ssrIncludeBooleanAttr(i === 0 || busy.value) ? " disabled" : ""} aria-label="上移" data-v-4edbf244>↑</button><button class="arrow"${ssrIncludeBooleanAttr(i === ofKind(1).length - 1 || busy.value) ? " disabled" : ""} aria-label="下移" data-v-4edbf244>↓</button><button class="btn btn-ghost btn-xs" data-v-4edbf244>单价</button><button class="btn btn-ghost btn-xs text-red-500" data-v-4edbf244>移除</button></div><div class="${ssrRenderClass([asrWhyClass(o), "svc-why"])}" data-v-4edbf244>${ssrInterpolate(asrWhy(o))}</div></div>`);
});
_push(`<!--]--></div><div class="card mt-4" data-v-4edbf244><div class="card-head" data-v-4edbf244><div data-v-4edbf244><div class="card-title" data-v-4edbf244>翻译</div><div class="card-desc" data-v-4edbf244>按顺序取<b data-v-4edbf244>第一个已启用</b>的服务;调用失败自动回退下一个。</div></div><div class="flex gap-2 shrink-0" data-v-4edbf244><button class="btn btn-xs"${ssrIncludeBooleanAttr(ofKind(2).length < 2 || busy.value) ? " disabled" : ""} data-v-4edbf244>⇅ 按参考单价重排</button><button class="btn btn-primary btn-xs text-white"${ssrIncludeBooleanAttr(!addable(2).length) ? " disabled" : ""} data-v-4edbf244>+ 添加翻译服务</button></div></div>`);
if (!ofKind(2).length) {
_push(`<div class="py-10 text-center text-slate-400 text-sm" data-v-4edbf244>暂无翻译服务</div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(ofKind(2), (o, i) => {
_push(`<div class="${ssrRenderClass([{ hit: mtHit.value && mtHit.value.row_id === o.row_id, off: !o.enabled }, "svc mt"])}" data-v-4edbf244><div class="${ssrRenderClass([{ hit: mtHit.value && mtHit.value.row_id === o.row_id }, "svc-rank"])}" data-v-4edbf244>${ssrInterpolate(i + 1)}</div><div class="min-w-0" data-v-4edbf244><div class="svc-name" data-v-4edbf244>${ssrInterpolate(svcName(o.svc_id))}</div><div class="svc-prov" data-v-4edbf244>${ssrInterpolate(svcProvider(o.svc_id))} · ${ssrInterpolate(o.svc_id)}</div></div><div class="svc-cost" data-v-4edbf244>`);
if (o.cost_hint) {
_push(`<!--[-->¥${ssrInterpolate(o.cost_hint)}<small data-v-4edbf244> /百万字符</small><!--]-->`);
} else {
_push(`<span class="text-slate-300" data-v-4edbf244>—</span>`);
}
_push(`</div><div data-v-4edbf244><input type="checkbox" class="toggle toggle-success toggle-sm"${ssrIncludeBooleanAttr(o.enabled) ? " checked" : ""}${ssrIncludeBooleanAttr(busy.value) ? " disabled" : ""} data-v-4edbf244></div><div class="svc-acts" data-v-4edbf244><button class="arrow"${ssrIncludeBooleanAttr(i === 0 || busy.value) ? " disabled" : ""} aria-label="上移" data-v-4edbf244>↑</button><button class="arrow"${ssrIncludeBooleanAttr(i === ofKind(2).length - 1 || busy.value) ? " disabled" : ""} aria-label="下移" data-v-4edbf244>↓</button><button class="btn btn-ghost btn-xs" data-v-4edbf244>单价</button><button class="btn btn-ghost btn-xs text-red-500" data-v-4edbf244>移除</button></div><div class="${ssrRenderClass([!o.enabled ? "no" : mtHit.value && mtHit.value.row_id === o.row_id ? "ok" : "", "svc-why"])}" data-v-4edbf244>`);
if (!o.enabled) {
_push(`<!--[-->已停用,跳过<!--]-->`);
} else if (mtHit.value && mtHit.value.row_id === o.row_id) {
_push(`<!--[-->✓ 默认由它承接,失败顺延<!--]-->`);
} else {
_push(`<!--[-->备用:前面失败时接手<!--]-->`);
}
_push(`</div></div>`);
});
_push(`<!--]--></div><div class="card mt-4" data-v-4edbf244><div class="card-head" data-v-4edbf244><div data-v-4edbf244><div class="card-title" data-v-4edbf244>总结(大模型)</div><div class="card-desc" data-v-4edbf244>后台指定默认模型,客户端可在允许范围内自选。带 🖼 的是<b data-v-4edbf244>多媒体大模型</b>,能识别会议里的图片。</div></div><button class="btn btn-primary btn-xs text-white shrink-0"${ssrIncludeBooleanAttr(!addable(3).length) ? " disabled" : ""} data-v-4edbf244>+ 添加模型</button></div><div class="mode-bar" data-v-4edbf244><label class="flex items-center gap-2 cursor-pointer shrink-0" data-v-4edbf244><input type="checkbox" class="toggle toggle-primary toggle-sm"${ssrIncludeBooleanAttr(llmClientChoice.value) ? " checked" : ""}${ssrIncludeBooleanAttr(busy.value) ? " disabled" : ""} data-v-4edbf244><span class="text-sm font-semibold text-slate-700" data-v-4edbf244>允许客户端指定模型</span></label><p class="mode-txt" data-v-4edbf244>`);
if (llmClientChoice.value) {
_push(`<!--[--> 前端能选 <b data-v-4edbf244>${ssrInterpolate(pickable.value.length)}</b> 个模型`);
if (pickable.value.length) {
_push(`<!--[-->:${ssrInterpolate(pickable.value.map((x) => svcName(x.svc_id)).join("、"))}<!--]-->`);
} else {
_push(`<!--[-->(一个都没勾「前端可见」,等同强制默认)<!--]-->`);
}
_push(`。不传则用默认 <b data-v-4edbf244>${ssrInterpolate(llmDefault.value ? svcName(llmDefault.value.svc_id) : "—")}</b>。 <!--]-->`);
} else {
_push(`<!--[--> 前端不下发模型列表,一律走默认模型 <b data-v-4edbf244>${ssrInterpolate(llmDefault.value ? svcName(llmDefault.value.svc_id) : "—")}</b>;客户端传了也忽略。 <!--]-->`);
}
_push(`</p></div>`);
if (!ofKind(3).length) {
_push(`<div class="py-10 text-center text-slate-400 text-sm" data-v-4edbf244>暂无模型</div>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(ofKind(3), (o) => {
_push(`<div class="${ssrRenderClass([{ isdefault: o.is_default, off: !o.enabled }, "svc llm"])}" data-v-4edbf244><div class="grid place-items-center" data-v-4edbf244><input type="radio" name="llmdef" class="radio radio-primary radio-xs"${ssrIncludeBooleanAttr(o.is_default) ? " checked" : ""}${ssrIncludeBooleanAttr(!o.enabled || busy.value) ? " disabled" : ""} data-v-4edbf244></div><div class="min-w-0" data-v-4edbf244><div class="svc-name" data-v-4edbf244>${ssrInterpolate(svcName(o.svc_id))} `);
if (isVision(o.svc_id)) {
_push(`<span title="多媒体大模型,能识图" data-v-4edbf244>🖼</span>`);
} else {
_push(`<!---->`);
}
if (o.is_default) {
_push(`<span class="chip chip-app ml-1" data-v-4edbf244>默认</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="svc-prov" data-v-4edbf244>${ssrInterpolate(svcProvider(o.svc_id))} · ${ssrInterpolate(o.svc_id)}</div></div><div class="svc-cost" data-v-4edbf244>`);
if (o.cost_hint) {
_push(`<!--[-->¥${ssrInterpolate(o.cost_hint)}<small data-v-4edbf244> /百万token</small><!--]-->`);
} else {
_push(`<span class="text-slate-300" data-v-4edbf244>—</span>`);
}
_push(`</div><div data-v-4edbf244><input type="checkbox" class="toggle toggle-success toggle-sm"${ssrIncludeBooleanAttr(o.client_visible) ? " checked" : ""}${ssrIncludeBooleanAttr(!llmClientChoice.value || !o.enabled || busy.value) ? " disabled" : ""}${ssrRenderAttr("title", !llmClientChoice.value ? "先打开「允许客户端指定模型」" : "")} data-v-4edbf244></div><div data-v-4edbf244><input type="checkbox" class="toggle toggle-success toggle-sm"${ssrIncludeBooleanAttr(o.enabled) ? " checked" : ""}${ssrIncludeBooleanAttr(busy.value) ? " disabled" : ""} data-v-4edbf244></div><div class="svc-acts" data-v-4edbf244><button class="btn btn-ghost btn-xs" data-v-4edbf244>单价</button><button class="btn btn-ghost btn-xs text-red-500" data-v-4edbf244>移除</button></div></div>`);
});
_push(`<!--]--><div class="col-h llm-h" data-v-4edbf244><div data-v-4edbf244></div><div data-v-4edbf244></div><div data-v-4edbf244>参考单价</div><div data-v-4edbf244>前端可见</div><div data-v-4edbf244>启用</div><div data-v-4edbf244></div></div></div><!--]-->`);
}
_push(`<dialog class="modal" data-v-4edbf244><div class="modal-box max-w-md" data-v-4edbf244><h3 class="font-bold text-lg" data-v-4edbf244>添加${ssrInterpolate(kindLabel(addKind.value))}服务</h3><p class="text-xs text-slate-400 mt-1" data-v-4edbf244>从第三方服务配置里选一个已配好的服务加入本段编排。</p><div class="mt-4 space-y-3" data-v-4edbf244><div class="form-control" data-v-4edbf244><label class="label py-1" data-v-4edbf244><span class="label-text text-sm font-medium" data-v-4edbf244>服务</span></label><select class="select select-bordered select-sm" data-v-4edbf244><option value="" data-v-4edbf244${ssrIncludeBooleanAttr(Array.isArray(addForm.svc_id) ? ssrLooseContain(addForm.svc_id, "") : ssrLooseEqual(addForm.svc_id, "")) ? " selected" : ""}>请选择服务…</option><!--[-->`);
ssrRenderList(addable(addKind.value), (s) => {
_push(`<option${ssrRenderAttr("value", s.id)} data-v-4edbf244${ssrIncludeBooleanAttr(Array.isArray(addForm.svc_id) ? ssrLooseContain(addForm.svc_id, s.id) : ssrLooseEqual(addForm.svc_id, s.id)) ? " selected" : ""}>${ssrInterpolate(s.name)}${ssrInterpolate(addKind.value === 3 && catsHas(s.categories, 9) ? " 🖼" : "")}(${ssrInterpolate(s.provider || s.id)}) </option>`);
});
_push(`<!--]--></select>`);
if (!addable(addKind.value).length) {
_push(`<span class="text-[11px] text-amber-600 mt-1" data-v-4edbf244>没有可添加的服务了(都加过了,或服务池里没这类服务)。</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="form-control" data-v-4edbf244><label class="label py-1" data-v-4edbf244><span class="label-text text-sm font-medium" data-v-4edbf244>参考单价(${ssrInterpolate(costUnit(addKind.value))},可空)</span></label><input${ssrRenderAttr("value", addForm.cost_hint)} type="number" step="0.01" min="0" class="input input-bordered input-sm font-mono text-xs" placeholder="0" data-v-4edbf244><span class="text-[11px] text-slate-400 mt-1" data-v-4edbf244>仅用于排序/展示,填你的实付价。</span></div>`);
if (addKind.value === 3) {
_push(`<div class="flex gap-4" data-v-4edbf244><label class="flex items-center gap-2 cursor-pointer" data-v-4edbf244><input${ssrIncludeBooleanAttr(Array.isArray(addForm.is_default) ? ssrLooseContain(addForm.is_default, null) : addForm.is_default) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-4edbf244><span class="text-sm" data-v-4edbf244>设为默认</span></label><label class="flex items-center gap-2 cursor-pointer" data-v-4edbf244><input${ssrIncludeBooleanAttr(Array.isArray(addForm.client_visible) ? ssrLooseContain(addForm.client_visible, null) : addForm.client_visible) ? " checked" : ""} type="checkbox" class="toggle toggle-success toggle-sm" data-v-4edbf244><span class="text-sm" data-v-4edbf244>前端可见</span></label></div>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="modal-action" data-v-4edbf244><button class="btn btn-ghost btn-sm" data-v-4edbf244>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(!addForm.svc_id || saving.value) ? " disabled" : ""} data-v-4edbf244>${ssrInterpolate(saving.value ? "添加中…" : "添加")}</button></div></div><form method="dialog" class="modal-backdrop" data-v-4edbf244><button data-v-4edbf244>close</button></form></dialog><dialog class="modal" data-v-4edbf244><div class="modal-box max-w-sm" data-v-4edbf244><h3 class="font-bold text-lg" data-v-4edbf244>参考单价</h3><p class="text-xs text-slate-400 mt-1" data-v-4edbf244>${ssrInterpolate(costEdit.name)}(${ssrInterpolate(costUnit(costEdit.kind))})</p><input${ssrRenderAttr("value", costEdit.cost_hint)} type="number" step="0.01" min="0" class="input input-bordered input-sm w-full font-mono text-xs mt-3" placeholder="0" data-v-4edbf244><div class="modal-action" data-v-4edbf244><button class="btn btn-ghost btn-sm" data-v-4edbf244>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(saving.value) ? " disabled" : ""} data-v-4edbf244>保存</button></div></div><form method="dialog" class="modal-backdrop" data-v-4edbf244><button data-v-4edbf244>close</button></form></dialog></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/meetingsvc.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const meetingsvc = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-4edbf244"]]);
export { meetingsvc as default };
//# sourceMappingURL=meetingsvc-Dcq0cJyO.mjs.map