feat(M08-A): 接入权益和余额下单抵扣
This commit is contained in:
@@ -28,6 +28,10 @@ Page({
|
||||
quote: null,
|
||||
order: null,
|
||||
payment: null,
|
||||
couponGrantId: '',
|
||||
packageHoldingId: '',
|
||||
packageMinutes: '',
|
||||
packageCreditYuan: '',
|
||||
},
|
||||
onLoad(options) {
|
||||
this.setData({
|
||||
@@ -36,6 +40,18 @@ Page({
|
||||
})
|
||||
},
|
||||
|
||||
updateBenefitField(event) {
|
||||
const field = event.currentTarget.dataset.field
|
||||
if (!field) return
|
||||
this.setData({
|
||||
[field]: event.detail.value,
|
||||
order: null,
|
||||
payment: null,
|
||||
successMessage: '',
|
||||
errorMessage: '',
|
||||
})
|
||||
},
|
||||
|
||||
setDuration(event) {
|
||||
this.setData({
|
||||
durationMinutes: Number(event.currentTarget.dataset.minutes),
|
||||
@@ -68,7 +84,9 @@ Page({
|
||||
const response = await request('/orders/reserve', { method: 'POST', data: payload })
|
||||
this.setData({
|
||||
order: response.data,
|
||||
successMessage: '时段已预占,请继续支付',
|
||||
successMessage: response.data.benefitReservation
|
||||
? '时段已预占,权益已冻结,请继续支付'
|
||||
: '时段已预占,请继续支付',
|
||||
})
|
||||
})
|
||||
},
|
||||
@@ -126,6 +144,30 @@ Page({
|
||||
})
|
||||
},
|
||||
|
||||
async createBalancePayment() {
|
||||
if (!this.data.order || !this.data.order.orderId) {
|
||||
this.setData({ errorMessage: '请先预占订单' })
|
||||
return
|
||||
}
|
||||
await this.withRequest(async () => {
|
||||
const response = await request('/payments', {
|
||||
method: 'POST',
|
||||
data: {
|
||||
orderId: this.data.order.orderId,
|
||||
provider: 'BALANCE',
|
||||
clientRequestId: clientRequestId('miniapp-balance'),
|
||||
},
|
||||
})
|
||||
this.setData({
|
||||
payment: {
|
||||
...response.data,
|
||||
amountText: cents(response.data.amountCents),
|
||||
},
|
||||
successMessage: '余额支付已完成',
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
async completeTestPayment() {
|
||||
if (!this.data.payment || !this.data.payment.paymentId) {
|
||||
this.setData({ errorMessage: '请先创建测试支付单' })
|
||||
@@ -156,6 +198,22 @@ Page({
|
||||
startAt: start.toISOString(),
|
||||
endAt: isoMinutesAfter(start, this.data.durationMinutes),
|
||||
pricingMode: this.data.pricingMode,
|
||||
benefits: this.benefitsPayload(),
|
||||
}
|
||||
},
|
||||
|
||||
benefitsPayload() {
|
||||
const couponGrantId = String(this.data.couponGrantId || '').trim()
|
||||
const packageHoldingId = String(this.data.packageHoldingId || '').trim()
|
||||
if (!couponGrantId && !packageHoldingId) return undefined
|
||||
const packageMinutes = Number(this.data.packageMinutes || 0)
|
||||
const packageCreditCents = Math.round(Number(this.data.packageCreditYuan || 0) * 100)
|
||||
return {
|
||||
couponGrantId: couponGrantId || null,
|
||||
packageHoldingId: packageHoldingId || null,
|
||||
packageMinutes: packageMinutes > 0 ? packageMinutes : 0,
|
||||
packageCreditCents: packageCreditCents > 0 ? packageCreditCents : 0,
|
||||
clientRequestId: clientRequestId('miniapp-benefit'),
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -9,10 +9,19 @@
|
||||
<button size="mini" class="{{durationMinutes === 180 ? 'selected' : ''}}" data-minutes="180" bindtap="setDuration">3小时</button>
|
||||
</view>
|
||||
|
||||
<view class="section-title">权益抵扣</view>
|
||||
<view class="benefit-grid">
|
||||
<input placeholder="优惠券ID" value="{{couponGrantId}}" data-field="couponGrantId" bindinput="updateBenefitField" />
|
||||
<input placeholder="套餐ID" value="{{packageHoldingId}}" data-field="packageHoldingId" bindinput="updateBenefitField" />
|
||||
<input placeholder="套餐分钟" type="number" value="{{packageMinutes}}" data-field="packageMinutes" bindinput="updateBenefitField" />
|
||||
<input placeholder="套餐抵扣元" type="digit" value="{{packageCreditYuan}}" data-field="packageCreditYuan" bindinput="updateBenefitField" />
|
||||
</view>
|
||||
|
||||
<view class="action-grid">
|
||||
<button loading="{{loading}}" bindtap="quote">报价</button>
|
||||
<button loading="{{loading}}" bindtap="reserve">预占</button>
|
||||
<button loading="{{loading}}" bindtap="createWechatPayment">微信支付</button>
|
||||
<button loading="{{loading}}" bindtap="createBalancePayment">余额支付</button>
|
||||
<button loading="{{loading}}" bindtap="createTestPayment">测试支付</button>
|
||||
<button loading="{{loading}}" bindtap="completeTestPayment">完成测试支付</button>
|
||||
</view>
|
||||
@@ -30,6 +39,8 @@
|
||||
<view class="result-title">订单</view>
|
||||
<view>订单编号:{{order.orderId}}</view>
|
||||
<view wx:if="{{order.reservationId}}">预占编号:{{order.reservationId}}</view>
|
||||
<view wx:if="{{order.quote.discountCents}}">优惠抵扣:{{order.quote.discountCents}}分</view>
|
||||
<view wx:if="{{order.quote.packageCreditCents}}">套餐抵扣:{{order.quote.packageCreditCents}}分</view>
|
||||
<button size="mini" data-order-id="{{order.orderId}}" bindtap="openOrder">查看订单</button>
|
||||
</view>
|
||||
|
||||
|
||||
@@ -22,13 +22,24 @@
|
||||
}
|
||||
|
||||
.duration-row,
|
||||
.action-grid {
|
||||
.action-grid,
|
||||
.benefit-grid {
|
||||
display: flex;
|
||||
gap: 16rpx;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: 24rpx;
|
||||
}
|
||||
|
||||
.benefit-grid input {
|
||||
box-sizing: border-box;
|
||||
flex: 1 1 280rpx;
|
||||
min-height: 72rpx;
|
||||
padding: 0 20rpx;
|
||||
border: 1rpx solid #d9dde5;
|
||||
border-radius: 12rpx;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.action-grid button {
|
||||
flex: 1 1 280rpx;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user