feat: 初始化居家上门服务系统完整项目代码

- Spring Boot 后端服务 (hss-home-service)
- delivery-miniapp 配送小程序
- website 官网 (Nuxt)
- docs 架构设计文档
- Docker 容器化部署配置

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 09:04:49 +08:00
parent 46c7887a18
commit c02029a5f3
471 changed files with 42313 additions and 2 deletions

View File

@@ -0,0 +1,517 @@
import { defineComponent, mergeProps, useSSRContext, ref, withCtx, createVNode, openBlock, createBlock, Fragment, renderList, toDisplayString, unref } from "vue";
import { ssrRenderAttrs, ssrInterpolate, ssrRenderSlot, ssrRenderClass, ssrRenderList, ssrRenderComponent } from "vue/server-renderer";
import { _ as _sfc_main$4 } from "./AppIcon--JRwwp2l.js";
import { _ as __nuxt_component_2 } from "./CtaSection-ClDHCKqS.js";
import { u as useSeo } from "./useSeo-BkcZp48C.js";
import { c as capabilities } from "../server.mjs";
import "./v3-eWcT6REp.js";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/@unhead/vue/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/hookable/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/unctx/dist/index.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/h3/dist/index.mjs";
import "vue-router";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/defu/dist/defu.mjs";
import "/home/akoo/居家服务/hss-home-service/website/node_modules/ufo/dist/index.mjs";
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
__name: "PlatformStatCard",
__ssrInlineRender: true,
props: {
label: {},
value: {},
suffix: {},
trend: {},
loading: { type: Boolean }
},
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bg-white rounded-2xl p-6 shadow-sm border border-gray-100" }, _attrs))}>`);
if (__props.loading) {
_push(`<div class="animate-pulse space-y-3"><div class="h-4 bg-gray-200 rounded w-16"></div><div class="h-8 bg-gray-200 rounded w-24"></div></div>`);
} else {
_push(`<!--[--><p class="text-sm text-text-secondary mb-2">${ssrInterpolate(__props.label)}</p><p class="text-3xl font-bold font-mono text-primary">${ssrInterpolate(__props.value)}`);
if (__props.suffix) {
_push(`<span class="text-lg text-text-secondary ml-1">${ssrInterpolate(__props.suffix)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</p>`);
if (__props.trend) {
_push(`<p class="text-xs text-accent mt-1">${ssrInterpolate(__props.trend)}</p>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
}
_push(`</div>`);
};
}
});
const _sfc_setup$3 = _sfc_main$3.setup;
_sfc_main$3.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/PlatformStatCard.vue");
return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0;
};
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
__name: "PlatformSection",
__ssrInlineRender: true,
props: {
title: {},
desc: {}
},
setup(__props) {
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bg-white rounded-2xl shadow-sm border border-gray-100 overflow-hidden" }, _attrs))}><div class="px-6 py-4 border-b border-gray-50 flex items-center justify-between"><div><h3 class="font-bold text-text-primary">${ssrInterpolate(__props.title)}</h3>`);
if (__props.desc) {
_push(`<p class="text-xs text-text-secondary mt-0.5">${ssrInterpolate(__props.desc)}</p>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex gap-2"><span class="w-2.5 h-2.5 rounded-full bg-red-400"></span><span class="w-2.5 h-2.5 rounded-full bg-yellow-400"></span><span class="w-2.5 h-2.5 rounded-full bg-green-400"></span></div></div><div class="p-0">`);
ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent);
_push(`</div></div>`);
};
}
});
const _sfc_setup$2 = _sfc_main$2.setup;
_sfc_main$2.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/PlatformSection.vue");
return _sfc_setup$2 ? _sfc_setup$2(props, ctx) : void 0;
};
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
__name: "PlatformWorkOrderRow",
__ssrInlineRender: true,
props: {
id: {},
patientName: {},
serviceType: {},
status: {},
serviceDate: {},
staffName: {}
},
setup(__props) {
const statusMap = {
ORDER_CREATED: { label: "待派单", class: "bg-gray-100 text-gray-600" },
ORDER_ASSIGNED: { label: "已派单", class: "bg-blue-50 text-blue-600" },
ORDER_ACCEPTED: { label: "已接单", class: "bg-indigo-50 text-indigo-600" },
ORDER_CHECKED_IN: { label: "已签到", class: "bg-teal-50 text-teal-600" },
ORDER_IN_SERVICE: { label: "服务中", class: "bg-accent-50 text-accent-700" },
ORDER_COMPLETED: { label: "已完成", class: "bg-green-50 text-green-600" },
ORDER_EXCEPTION: { label: "异常", class: "bg-red-50 text-red-600" },
ACCEPTED: { label: "已验收", class: "bg-green-100 text-green-700" }
};
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "flex items-center gap-4 px-4 py-3 bg-white border-b border-gray-50 hover:bg-gray-50 transition-colors" }, _attrs))}><span class="text-sm text-text-secondary w-12 shrink-0">#${ssrInterpolate(__props.id)}</span><span class="text-sm font-medium flex-1 truncate">${ssrInterpolate(__props.patientName)}</span><span class="text-xs text-text-secondary w-16 shrink-0">${ssrInterpolate(__props.serviceType)}</span><span class="text-xs w-24 shrink-0">${ssrInterpolate(__props.serviceDate)}</span><span class="${ssrRenderClass([statusMap[__props.status]?.class || "bg-gray-100", "text-xs px-2 py-1 rounded-full font-medium shrink-0"])}">${ssrInterpolate(statusMap[__props.status]?.label || __props.status)}</span><span class="text-xs text-text-secondary w-20 shrink-0 truncate">${ssrInterpolate(__props.staffName || "-")}</span></div>`);
};
}
});
const _sfc_setup$1 = _sfc_main$1.setup;
_sfc_main$1.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/PlatformWorkOrderRow.vue");
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
};
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "demo",
__ssrInlineRender: true,
setup(__props) {
useSeo({ title: "平台演示", description: "智慧医养居家上门服务平台 — 功能演示与真实数据展示" });
const dashboard = ref({});
ref({});
const quality = ref({});
ref([]);
ref([]);
ref(true);
const activeTab = ref("overview");
const tabs = [
{ key: "overview", label: "管理看板" },
{ key: "orders", label: "工单管理" },
{ key: "dispatch", label: "派单调度" },
{ key: "delivery", label: "移动执行" }
];
function fmt(n, def = "--") {
if (n === null || n === void 0) return def;
if (typeof n === "number") return n.toLocaleString();
return String(n);
}
return (_ctx, _push, _parent, _attrs) => {
const _component_PlatformStatCard = _sfc_main$3;
const _component_PlatformSection = _sfc_main$2;
const _component_AppIcon = _sfc_main$4;
const _component_PlatformWorkOrderRow = _sfc_main$1;
const _component_CtaSection = __nuxt_component_2;
_push(`<!--[--><section class="py-16 bg-gradient-to-br from-primary-700 to-primary-900 text-white"><div class="section-container"><span class="text-sm text-blue-200 mb-2 block">Platform Demo</span><h1 class="text-4xl md:text-5xl font-bold mb-4">平台功能演示</h1><p class="text-lg text-blue-100 max-w-2xl">以下展示平台真实管理界面,数据通过后端 API 实时获取</p></div></section><div class="bg-white border-b sticky top-16 z-30"><div class="section-container flex gap-0 overflow-x-auto"><!--[-->`);
ssrRenderList(tabs, (t) => {
_push(`<button class="${ssrRenderClass([activeTab.value === t.key ? "border-primary text-primary" : "border-transparent text-text-secondary hover:text-text-primary", "px-6 py-4 text-sm font-medium border-b-2 transition-colors shrink-0"])}">${ssrInterpolate(t.label)}</button>`);
});
_push(`<!--]--></div></div>`);
if (activeTab.value === "overview") {
_push(`<section class="py-12 bg-surface"><div class="section-container space-y-8"><div class="grid grid-cols-2 lg:grid-cols-4 gap-4">`);
_push(ssrRenderComponent(_component_PlatformStatCard, {
label: "今日工单",
value: fmt(dashboard.value.todayOrders),
suffix: "单"
}, null, _parent));
_push(ssrRenderComponent(_component_PlatformStatCard, {
label: "进行中",
value: fmt(dashboard.value.inProgress),
suffix: "单"
}, null, _parent));
_push(ssrRenderComponent(_component_PlatformStatCard, {
label: "服务完成率",
value: fmt(quality.value.serviceCompletionRate),
suffix: "%"
}, null, _parent));
_push(ssrRenderComponent(_component_PlatformStatCard, {
label: "活跃服务人员",
value: fmt(dashboard.value.availableStaff),
suffix: "人"
}, null, _parent));
_push(`</div><div class="grid lg:grid-cols-2 gap-8">`);
_push(ssrRenderComponent(_component_PlatformSection, {
title: "实时工单状态分布",
desc: "各状态工单数量概览"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-6 grid grid-cols-2 gap-3"${_scopeId}><!--[-->`);
ssrRenderList([
{ label: "待派单", v: dashboard.value.pendingDispatch, c: "bg-gray-100" },
{ label: "进行中", v: dashboard.value.inProgress, c: "bg-blue-50" },
{ label: "已完成", v: dashboard.value.completedToday, c: "bg-green-50" },
{ label: "异常", v: dashboard.value.exceptions, c: "bg-red-50" }
], (item) => {
_push2(`<div class="${ssrRenderClass(["rounded-xl p-4 text-center", item.c])}"${_scopeId}><div class="text-2xl font-bold font-mono"${_scopeId}>${ssrInterpolate(fmt(item.v))}</div><div class="text-xs text-text-secondary mt-1"${_scopeId}>${ssrInterpolate(item.label)}</div></div>`);
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "p-6 grid grid-cols-2 gap-3" }, [
(openBlock(true), createBlock(Fragment, null, renderList([
{ label: "待派单", v: dashboard.value.pendingDispatch, c: "bg-gray-100" },
{ label: "进行中", v: dashboard.value.inProgress, c: "bg-blue-50" },
{ label: "已完成", v: dashboard.value.completedToday, c: "bg-green-50" },
{ label: "异常", v: dashboard.value.exceptions, c: "bg-red-50" }
], (item) => {
return openBlock(), createBlock("div", {
key: item.label,
class: ["rounded-xl p-4 text-center", item.c]
}, [
createVNode("div", { class: "text-2xl font-bold font-mono" }, toDisplayString(fmt(item.v)), 1),
createVNode("div", { class: "text-xs text-text-secondary mt-1" }, toDisplayString(item.label), 1)
], 2);
}), 128))
])
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_PlatformSection, {
title: "核心能力模块",
desc: "平台覆盖居家服务全流程"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-6 grid grid-cols-2 gap-3"${_scopeId}><!--[-->`);
ssrRenderList(unref(capabilities).slice(0, 8), (c) => {
_push2(`<div class="flex items-center gap-3 p-3 rounded-xl hover:bg-primary-50 transition-colors cursor-pointer group"${_scopeId}><div class="w-10 h-10 rounded-lg bg-primary-50 text-primary flex items-center justify-center group-hover:bg-primary group-hover:text-white transition-colors shrink-0"${_scopeId}>`);
_push2(ssrRenderComponent(_component_AppIcon, {
name: c.icon,
class: "w-5 h-5"
}, null, _parent2, _scopeId));
_push2(`</div><div class="min-w-0"${_scopeId}><div class="text-sm font-medium truncate"${_scopeId}>${ssrInterpolate(c.title)}</div><div class="text-xs text-text-secondary truncate"${_scopeId}>${ssrInterpolate(c.desc)}</div></div></div>`);
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "p-6 grid grid-cols-2 gap-3" }, [
(openBlock(true), createBlock(Fragment, null, renderList(unref(capabilities).slice(0, 8), (c) => {
return openBlock(), createBlock("div", {
key: c.title,
class: "flex items-center gap-3 p-3 rounded-xl hover:bg-primary-50 transition-colors cursor-pointer group"
}, [
createVNode("div", { class: "w-10 h-10 rounded-lg bg-primary-50 text-primary flex items-center justify-center group-hover:bg-primary group-hover:text-white transition-colors shrink-0" }, [
createVNode(_component_AppIcon, {
name: c.icon,
class: "w-5 h-5"
}, null, 8, ["name"])
]),
createVNode("div", { class: "min-w-0" }, [
createVNode("div", { class: "text-sm font-medium truncate" }, toDisplayString(c.title), 1),
createVNode("div", { class: "text-xs text-text-secondary truncate" }, toDisplayString(c.desc), 1)
])
]);
}), 128))
])
];
}
}),
_: 1
}, _parent));
_push(`</div></div></section>`);
} else {
_push(`<!---->`);
}
if (activeTab.value === "orders") {
_push(`<section class="py-12 bg-surface"><div class="section-container space-y-6">`);
_push(ssrRenderComponent(_component_PlatformSection, {
title: "工单管理",
desc: "受理、派单、接单、执行、完成全流程工单视图"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="divide-y divide-gray-50"${_scopeId}><div class="flex items-center gap-4 px-4 py-3 bg-gray-50 text-xs font-medium text-text-secondary"${_scopeId}><span class="w-12"${_scopeId}>ID</span><span class="flex-1"${_scopeId}>服务对象</span><span class="w-16"${_scopeId}>类型</span><span class="w-24"${_scopeId}>日期</span><span class="w-24"${_scopeId}>状态</span><span class="w-20"${_scopeId}>人员</span></div><!--[-->`);
ssrRenderList([
{ id: 1001, patientName: "张奶奶", serviceType: "居家护理", status: "ORDER_IN_SERVICE", serviceDate: "2026-05-18", staffName: "李护理员" },
{ id: 1002, patientName: "王大爷", serviceType: "康复训练", status: "ORDER_COMPLETED", serviceDate: "2026-05-18", staffName: "张康复师" },
{ id: 1003, patientName: "赵阿姨", serviceType: "助浴服务", status: "ORDER_ASSIGNED", serviceDate: "2026-05-18", staffName: "--" },
{ id: 1004, patientName: "刘爷爷", serviceType: "健康管理", status: "ORDER_CHECKED_IN", serviceDate: "2026-05-18", staffName: "陈护理员" },
{ id: 1005, patientName: "孙奶奶", serviceType: "能力评估", status: "ORDER_EXCEPTION", serviceDate: "2026-05-17", staffName: "周评估员" }
], (wo) => {
_push2(ssrRenderComponent(_component_PlatformWorkOrderRow, mergeProps({
key: wo.id
}, { ref_for: true }, wo), null, _parent2, _scopeId));
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "divide-y divide-gray-50" }, [
createVNode("div", { class: "flex items-center gap-4 px-4 py-3 bg-gray-50 text-xs font-medium text-text-secondary" }, [
createVNode("span", { class: "w-12" }, "ID"),
createVNode("span", { class: "flex-1" }, "服务对象"),
createVNode("span", { class: "w-16" }, "类型"),
createVNode("span", { class: "w-24" }, "日期"),
createVNode("span", { class: "w-24" }, "状态"),
createVNode("span", { class: "w-20" }, "人员")
]),
(openBlock(), createBlock(Fragment, null, renderList([
{ id: 1001, patientName: "张奶奶", serviceType: "居家护理", status: "ORDER_IN_SERVICE", serviceDate: "2026-05-18", staffName: "李护理员" },
{ id: 1002, patientName: "王大爷", serviceType: "康复训练", status: "ORDER_COMPLETED", serviceDate: "2026-05-18", staffName: "张康复师" },
{ id: 1003, patientName: "赵阿姨", serviceType: "助浴服务", status: "ORDER_ASSIGNED", serviceDate: "2026-05-18", staffName: "--" },
{ id: 1004, patientName: "刘爷爷", serviceType: "健康管理", status: "ORDER_CHECKED_IN", serviceDate: "2026-05-18", staffName: "陈护理员" },
{ id: 1005, patientName: "孙奶奶", serviceType: "能力评估", status: "ORDER_EXCEPTION", serviceDate: "2026-05-17", staffName: "周评估员" }
], (wo) => {
return createVNode(_component_PlatformWorkOrderRow, mergeProps({
key: wo.id
}, { ref_for: true }, wo), null, 16);
}), 64))
])
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_PlatformSection, {
title: "工单状态流转",
desc: "状态机驱动的完整流转路径"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-6"${_scopeId}><div class="flex flex-wrap items-center gap-2 text-xs"${_scopeId}><span class="px-3 py-1.5 rounded-full bg-gray-100"${_scopeId}>ORDER_CREATED</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-blue-50 text-blue-600"${_scopeId}>ORDER_ASSIGNED</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-indigo-50 text-indigo-600"${_scopeId}>ORDER_ACCEPTED</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-teal-50 text-teal-600"${_scopeId}>ORDER_CHECKED_IN</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-accent-50 text-accent-700"${_scopeId}>ORDER_IN_SERVICE</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-green-50 text-green-600"${_scopeId}>ORDER_COMPLETED</span><span class="text-gray-300"${_scopeId}>→</span><span class="px-3 py-1.5 rounded-full bg-green-100 text-green-700"${_scopeId}>ACCEPTED</span></div></div>`);
} else {
return [
createVNode("div", { class: "p-6" }, [
createVNode("div", { class: "flex flex-wrap items-center gap-2 text-xs" }, [
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-gray-100" }, "ORDER_CREATED"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-blue-50 text-blue-600" }, "ORDER_ASSIGNED"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-indigo-50 text-indigo-600" }, "ORDER_ACCEPTED"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-teal-50 text-teal-600" }, "ORDER_CHECKED_IN"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-accent-50 text-accent-700" }, "ORDER_IN_SERVICE"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-green-50 text-green-600" }, "ORDER_COMPLETED"),
createVNode("span", { class: "text-gray-300" }, "→"),
createVNode("span", { class: "px-3 py-1.5 rounded-full bg-green-100 text-green-700" }, "ACCEPTED")
])
])
];
}
}),
_: 1
}, _parent));
_push(`</div></section>`);
} else {
_push(`<!---->`);
}
if (activeTab.value === "dispatch") {
_push(`<section class="py-12 bg-surface"><div class="section-container space-y-6">`);
_push(ssrRenderComponent(_component_PlatformSection, {
title: "调度工作台",
desc: "智能推荐 + 人工确认,两阶段派单"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-6 space-y-4"${_scopeId}><div class="flex items-center justify-between p-4 bg-primary-50 rounded-xl"${_scopeId}><div${_scopeId}><div class="text-sm font-bold"${_scopeId}>#1003 赵阿姨 — 助浴服务</div><div class="text-xs text-text-secondary"${_scopeId}>梅江区金山街道 · 2026-05-18 09:00-10:00 · 低风险</div></div><span class="px-3 py-1.5 bg-primary text-white rounded-lg text-xs font-medium"${_scopeId}>待派单</span></div><div class="text-sm font-medium text-text-primary mt-4 mb-2"${_scopeId}>智能推荐 Top 3</div><!--[-->`);
ssrRenderList([
{ name: "李护理员", score: 92, reasons: "资质匹配·距离1.2km·负载低·满意度4.8" },
{ name: "王护理员", score: 85, reasons: "区域匹配·技能匹配·今日工单2/6" },
{ name: "陈护理员", score: 78, reasons: "曾服务该对象·满意度4.6·工单量适中" }
], (r, i) => {
_push2(`<div class="flex items-center gap-4 p-4 rounded-xl border hover:border-primary hover:bg-primary-50/50 transition-colors cursor-pointer"${_scopeId}><span class="w-10 h-10 rounded-full bg-gradient-to-br from-primary-50 to-accent-50 text-primary flex items-center justify-center font-bold text-sm shrink-0"${_scopeId}>${ssrInterpolate(i + 1)}</span><div class="flex-1 min-w-0"${_scopeId}><div class="text-sm font-medium"${_scopeId}>${ssrInterpolate(r.name)}</div><div class="text-xs text-text-secondary truncate"${_scopeId}>${ssrInterpolate(r.reasons)}</div></div><span class="text-lg font-bold font-mono text-primary shrink-0"${_scopeId}>${ssrInterpolate(r.score)}</span><button class="px-4 py-2 bg-primary text-white rounded-lg text-xs font-medium hover:bg-primary-700 transition-colors shrink-0"${_scopeId}>派单</button></div>`);
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "p-6 space-y-4" }, [
createVNode("div", { class: "flex items-center justify-between p-4 bg-primary-50 rounded-xl" }, [
createVNode("div", null, [
createVNode("div", { class: "text-sm font-bold" }, "#1003 赵阿姨 — 助浴服务"),
createVNode("div", { class: "text-xs text-text-secondary" }, "梅江区金山街道 · 2026-05-18 09:00-10:00 · 低风险")
]),
createVNode("span", { class: "px-3 py-1.5 bg-primary text-white rounded-lg text-xs font-medium" }, "待派单")
]),
createVNode("div", { class: "text-sm font-medium text-text-primary mt-4 mb-2" }, "智能推荐 Top 3"),
(openBlock(), createBlock(Fragment, null, renderList([
{ name: "李护理员", score: 92, reasons: "资质匹配·距离1.2km·负载低·满意度4.8" },
{ name: "王护理员", score: 85, reasons: "区域匹配·技能匹配·今日工单2/6" },
{ name: "陈护理员", score: 78, reasons: "曾服务该对象·满意度4.6·工单量适中" }
], (r, i) => {
return createVNode("div", {
key: i,
class: "flex items-center gap-4 p-4 rounded-xl border hover:border-primary hover:bg-primary-50/50 transition-colors cursor-pointer"
}, [
createVNode("span", { class: "w-10 h-10 rounded-full bg-gradient-to-br from-primary-50 to-accent-50 text-primary flex items-center justify-center font-bold text-sm shrink-0" }, toDisplayString(i + 1), 1),
createVNode("div", { class: "flex-1 min-w-0" }, [
createVNode("div", { class: "text-sm font-medium" }, toDisplayString(r.name), 1),
createVNode("div", { class: "text-xs text-text-secondary truncate" }, toDisplayString(r.reasons), 1)
]),
createVNode("span", { class: "text-lg font-bold font-mono text-primary shrink-0" }, toDisplayString(r.score), 1),
createVNode("button", { class: "px-4 py-2 bg-primary text-white rounded-lg text-xs font-medium hover:bg-primary-700 transition-colors shrink-0" }, "派单")
]);
}), 64))
])
];
}
}),
_: 1
}, _parent));
_push(`</div></section>`);
} else {
_push(`<!---->`);
}
if (activeTab.value === "delivery") {
_push(`<section class="py-12 bg-surface"><div class="section-container space-y-6"><div class="grid lg:grid-cols-3 gap-6">`);
_push(ssrRenderComponent(_component_PlatformSection, { title: "Delivery 工作台" }, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-4 space-y-3"${_scopeId}><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>今日工单</span><span class="font-bold"${_scopeId}>6</span></div><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>待接单</span><span class="font-bold text-blue-600"${_scopeId}>2</span></div><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>待签到</span><span class="font-bold text-teal-600"${_scopeId}>1</span></div><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>服务中</span><span class="font-bold text-accent-700"${_scopeId}>1</span></div><div class="flex items-center justify-between text-sm"${_scopeId}><span class="text-text-secondary"${_scopeId}>已完成</span><span class="font-bold text-green-600"${_scopeId}>2</span></div></div>`);
} else {
return [
createVNode("div", { class: "p-4 space-y-3" }, [
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "今日工单"),
createVNode("span", { class: "font-bold" }, "6")
]),
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "待接单"),
createVNode("span", { class: "font-bold text-blue-600" }, "2")
]),
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "待签到"),
createVNode("span", { class: "font-bold text-teal-600" }, "1")
]),
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "服务中"),
createVNode("span", { class: "font-bold text-accent-700" }, "1")
]),
createVNode("div", { class: "flex items-center justify-between text-sm" }, [
createVNode("span", { class: "text-text-secondary" }, "已完成"),
createVNode("span", { class: "font-bold text-green-600" }, "2")
])
])
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_PlatformSection, { title: "GPS 签到" }, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-4 space-y-3"${_scopeId}><div class="text-xs text-text-secondary"${_scopeId}>当前位置距服务地址</div><div class="text-3xl font-bold font-mono text-accent-700"${_scopeId}>85m</div><div class="text-xs text-green-600"${_scopeId}>✓ 200米范围内可签到</div><div class="flex gap-2 mt-3"${_scopeId}><div class="w-full h-20 rounded-xl bg-gray-100 flex items-center justify-center text-xs text-text-secondary"${_scopeId}>📷 现场拍照</div><div class="w-full h-20 rounded-xl bg-gray-100 flex items-center justify-center text-xs text-text-secondary"${_scopeId}>✍️ 对象确认</div></div><button class="w-full py-3 bg-cta text-white rounded-xl text-sm font-bold hover:bg-cta-700 transition-colors"${_scopeId}>确认签到</button></div>`);
} else {
return [
createVNode("div", { class: "p-4 space-y-3" }, [
createVNode("div", { class: "text-xs text-text-secondary" }, "当前位置距服务地址"),
createVNode("div", { class: "text-3xl font-bold font-mono text-accent-700" }, "85m"),
createVNode("div", { class: "text-xs text-green-600" }, "✓ 200米范围内可签到"),
createVNode("div", { class: "flex gap-2 mt-3" }, [
createVNode("div", { class: "w-full h-20 rounded-xl bg-gray-100 flex items-center justify-center text-xs text-text-secondary" }, "📷 现场拍照"),
createVNode("div", { class: "w-full h-20 rounded-xl bg-gray-100 flex items-center justify-center text-xs text-text-secondary" }, "✍️ 对象确认")
]),
createVNode("button", { class: "w-full py-3 bg-cta text-white rounded-xl text-sm font-bold hover:bg-cta-700 transition-colors" }, "确认签到")
])
];
}
}),
_: 1
}, _parent));
_push(ssrRenderComponent(_component_PlatformSection, { title: "项目执行记录" }, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`<div class="p-4 space-y-3"${_scopeId}><!--[-->`);
ssrRenderList([
{ name: "助洁服务", status: "COMPLETED", time: "09:15-10:05", duration: "50分钟" },
{ name: "健康监测", status: "IN_PROGRESS", time: "10:10-", duration: "进行中" },
{ name: "康复指导", status: "PENDING", time: "--", duration: "待执行" }
], (item, i) => {
_push2(`<div class="flex items-center gap-3 text-sm"${_scopeId}><span class="${ssrRenderClass([
"w-2 h-2 rounded-full shrink-0",
item.status === "COMPLETED" ? "bg-green-500" : item.status === "IN_PROGRESS" ? "bg-accent" : "bg-gray-300"
])}"${_scopeId}></span><span class="flex-1 font-medium"${_scopeId}>${ssrInterpolate(item.name)}</span><span class="text-xs text-text-secondary"${_scopeId}>${ssrInterpolate(item.time)}</span><span class="text-xs text-text-secondary w-14 text-right"${_scopeId}>${ssrInterpolate(item.duration)}</span></div>`);
});
_push2(`<!--]--></div>`);
} else {
return [
createVNode("div", { class: "p-4 space-y-3" }, [
(openBlock(), createBlock(Fragment, null, renderList([
{ name: "助洁服务", status: "COMPLETED", time: "09:15-10:05", duration: "50分钟" },
{ name: "健康监测", status: "IN_PROGRESS", time: "10:10-", duration: "进行中" },
{ name: "康复指导", status: "PENDING", time: "--", duration: "待执行" }
], (item, i) => {
return createVNode("div", {
key: i,
class: "flex items-center gap-3 text-sm"
}, [
createVNode("span", {
class: [
"w-2 h-2 rounded-full shrink-0",
item.status === "COMPLETED" ? "bg-green-500" : item.status === "IN_PROGRESS" ? "bg-accent" : "bg-gray-300"
]
}, null, 2),
createVNode("span", { class: "flex-1 font-medium" }, toDisplayString(item.name), 1),
createVNode("span", { class: "text-xs text-text-secondary" }, toDisplayString(item.time), 1),
createVNode("span", { class: "text-xs text-text-secondary w-14 text-right" }, toDisplayString(item.duration), 1)
]);
}), 64))
])
];
}
}),
_: 1
}, _parent));
_push(`</div></div></section>`);
} else {
_push(`<!---->`);
}
_push(ssrRenderComponent(_component_CtaSection, null, null, _parent));
_push(`<!--]-->`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/demo.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=demo-BC4si0ca.js.map