Files
xiaomai a5ac00baa1 feat(pricing): introduce real-time budget estimator
This commit introduces a real-time budget estimator for event services. A new summary sidebar now displays a live,
itemized breakdown of costs as the user selects options in the order form.

Key changes include:
- A new `OrderSummary` component to display the price breakdown and total.
- Comprehensive pricing logic implemented in the `useEventOrder` composable.
- A responsive two-column layout on the main page to accommodate the summary.
- UI/UX improvements across the form, including clearer labels and subtle transition animations for conditional fields.
2025-10-16 21:14:44 +08:00

64 lines
1.8 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<UCard>
<template #header>
<h2 class="text-xl font-bold">{{ secIdx }}. 竞标大屏系统</h2>
<p class="text-muted text-sm">
自研竞标展示系统全马首创适用于宴会活动庆典等场合具备实时竞标显示功能
</p>
</template>
<div class="grid grid-cols-1 sm:grid-cols-3 gap-4">
<UCheckbox
v-model="orderState.biddingSystem"
label="需要"
description="包含图片处理 & 宴会当日技术支持(场控 / 协调)"
/>
<Transition name="fade">
<USwitch
v-if="orderState.biddingSystem"
v-model="orderState.biddingSystemProvideImage"
:label="
orderState.biddingSystemProvideImage ? '素材自备' : '请求拍摄'
"
:description="
orderState.biddingSystemProvideImage
? '您提供图片(我们进行后处理)'
: '我们需要到您单位去拍摄标品'
"
/>
</Transition>
<Transition name="fade">
<UFormField
v-if="orderState.biddingSystem"
name="estimatedBidItemCount"
label="估算件数"
description="不影响计价"
>
<USelect
v-model="orderState.estimatedBidItemCount"
:items="itemCountRanges"
placeholder="请选择件数区间"
:class="['w-full']"
/>
</UFormField>
</Transition>
</div>
</UCard>
</template>
<script lang="ts" setup>
const { sectionIndex, orderState } = useEventOrder();
const secIdx = ref(++sectionIndex.value);
const itemCountRanges = Array.from({ length: 4 }, (_, i) => {
const start = 10 + i * 10;
const end = start + 10;
return { label: `${start} ~ ${end}`, value: `${start}-${end}` };
});
</script>
<style></style>