Files
xk-doctor-wx/subPackages/sub_business_shared/components/OrderPricePercentAdjustPopup.vue
2026-06-18 10:20:24 +08:00

129 lines
3.9 KiB
Vue
Raw 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>
<u-popup v-model="show" mode="bottom" border-radius="16" height="auto" :closeable="true" @close="onClose">
<view class="popup">
<view class="title">整单调价</view>
<view v-if="currentLabel" class="hint">当前浮动{{ currentLabel }}</view>
<view class="row">
<text class="label">价格比例100=原价</text>
<input class="input" type="digit" v-model="discountInput" placeholder="如 90=九折120=涨20%" />
</view>
<view v-if="discountQuickOptions.length" class="quick-row">
<text class="quick-label">快捷打折</text>
<view class="quick-wrap">
<text
v-for="opt in discountQuickOptions"
:key="'d-' + opt.value"
class="quick"
@click="discountInput = String(opt.value)"
>{{ opt.name }}</text>
</view>
</view>
<view v-if="markupQuickOptions.length" class="quick-row">
<text class="quick-label">快捷涨价</text>
<view class="quick-wrap">
<text
v-for="opt in markupQuickOptions"
:key="'m-' + opt.value"
class="quick markup"
@click="discountInput = String(opt.value)"
>{{ opt.name }}</text>
</view>
</view>
<view class="actions">
<button class="btn cancel" @click="onClose">取消</button>
<button class="btn ghost" @click="discountInput = '100'">清除浮动</button>
<button class="btn confirm" :loading="submitting" @click="onConfirm">确定</button>
</view>
</view>
</u-popup>
</template>
<script>
import { formatPriceDiscountLabel } from '@/subPackages/sub_business_shared/common/pricePercentAdjust.js'
export default {
name: 'OrderPricePercentAdjustPopup',
props: {
visible: { type: Boolean, default: false },
currentDiscount: { type: [Number, String], default: 100 },
quickOptions: { type: Array, default: () => [] },
submitting: { type: Boolean, default: false },
},
data() {
return {
show: false,
discountInput: '100',
}
},
computed: {
currentLabel() {
return formatPriceDiscountLabel(Number(this.currentDiscount) || 100)
},
discountQuickOptions() {
return (this.quickOptions || []).filter((o) => Number(o.value) < 100)
},
markupQuickOptions() {
return (this.quickOptions || []).filter((o) => Number(o.value) > 100)
},
},
watch: {
visible: {
immediate: true,
handler(v) {
this.show = v
if (v) {
this.syncDiscountInput()
}
},
},
currentDiscount(v) {
if (this.show) {
this.syncDiscountInput(v)
}
},
show(v) {
if (!v) this.$emit('close')
},
},
methods: {
syncDiscountInput(discount) {
const d = Number(discount ?? this.currentDiscount) || 100
this.discountInput = String(d)
},
onClose() {
this.show = false
},
onConfirm() {
const priceDiscount = parseInt(String(this.discountInput).trim(), 10)
if (!priceDiscount || priceDiscount <= 0) {
uni.showToast({ title: '请输入有效比例', icon: 'none' })
return
}
this.$emit('confirm', { priceDiscount })
},
},
}
</script>
<style lang="scss" scoped>
.popup { padding: 32rpx 32rpx 48rpx; }
.title { font-size: 32rpx; font-weight: 600; text-align: center; }
.hint { font-size: 26rpx; color: #666; text-align: center; margin-top: 12rpx; }
.row { margin-top: 28rpx; }
.label, .quick-label { font-size: 26rpx; color: #666; display: block; margin-bottom: 12rpx; }
.input { background: #f5f5f5; border-radius: 12rpx; padding: 20rpx; font-size: 28rpx; }
.quick-row { margin-top: 20rpx; }
.quick-wrap { display: flex; flex-wrap: wrap; gap: 16rpx; }
.quick { padding: 10rpx 24rpx; background: #eef9f6; color: #6acdbb; border-radius: 20rpx; font-size: 24rpx; }
.quick.markup { background: #fff7e6; color: #fa8c16; }
.actions { display: flex; gap: 16rpx; margin-top: 36rpx; }
.btn { flex: 1; font-size: 28rpx; border-radius: 12rpx; }
.cancel { background: #f5f5f5; color: #666; }
.ghost { background: #fff; color: #6acdbb; border: 1rpx solid #6acdbb; }
.confirm { background: #6acdbb; color: #fff; }
</style>