This commit is contained in:
parent
70c37c4ad6
commit
3f23dee33f
|
|
@ -166,12 +166,12 @@ export default {
|
||||||
if (!this.validateForm()) return
|
if (!this.validateForm()) return
|
||||||
const token = uni.getStorageSync('token')
|
const token = uni.getStorageSync('token')
|
||||||
if (!token) {
|
if (!token) {
|
||||||
// 保存表单数据,登录后恢复
|
|
||||||
uni.setStorageSync('loginFormData', JSON.stringify(this.form))
|
uni.setStorageSync('loginFormData', JSON.stringify(this.form))
|
||||||
uni.setStorageSync('loginRedirect', '/pages/delivery/delivery')
|
uni.setStorageSync('loginRedirect', '/pages/delivery/delivery')
|
||||||
uni.navigateTo({ url: '/pages/login/login' }); return
|
uni.navigateTo({ url: '/pages/login/login' }); return
|
||||||
}
|
}
|
||||||
this.submitting = true
|
this.submitting = true
|
||||||
|
let orderId = null
|
||||||
try {
|
try {
|
||||||
const commission = parseFloat(this.form.commission)
|
const commission = parseFloat(this.form.commission)
|
||||||
const result = await createOrder({
|
const result = await createOrder({
|
||||||
|
|
@ -184,20 +184,26 @@ export default {
|
||||||
commission,
|
commission,
|
||||||
totalAmount: commission
|
totalAmount: commission
|
||||||
})
|
})
|
||||||
|
orderId = result.id
|
||||||
if (result.paymentParams) {
|
if (result.paymentParams) {
|
||||||
try {
|
try {
|
||||||
await this.wxPay(result.paymentParams)
|
await this.wxPay(result.paymentParams)
|
||||||
// 支付成功,确认订单上架
|
|
||||||
try { await confirmPayment(result.id) } catch (ex) {}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// 支付失败/取消,撤销订单
|
try { await cancelOrder(orderId) } catch (ex) {}
|
||||||
try { await cancelOrder(result.id) } catch (ex) {}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// 支付成功,确认订单上架(带重试)
|
||||||
|
try {
|
||||||
|
await confirmPayment(orderId)
|
||||||
|
} catch (ex) {
|
||||||
|
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uni.showToast({ title: '下单成功', icon: 'success' })
|
uni.showToast({ title: '下单成功', icon: 'success' })
|
||||||
setTimeout(() => { uni.navigateBack() }, 1500)
|
setTimeout(() => { uni.navigateBack() }, 1500)
|
||||||
} catch (e) {} finally { this.submitting = false }
|
} catch (e) {
|
||||||
|
console.error('下单失败', e)
|
||||||
|
} finally { this.submitting = false }
|
||||||
},
|
},
|
||||||
wxPay(params) {
|
wxPay(params) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
|
||||||
|
|
@ -210,13 +210,15 @@ export default {
|
||||||
if (result.paymentParams) {
|
if (result.paymentParams) {
|
||||||
try {
|
try {
|
||||||
await this.wxPay(result.paymentParams)
|
await this.wxPay(result.paymentParams)
|
||||||
// 支付成功,确认订单上架
|
|
||||||
try { await confirmPayment(result.id) } catch (ex) {}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// 支付失败/取消,撤销订单
|
// 支付失败/取消,撤销订单
|
||||||
try { await cancelOrder(result.id) } catch (ex) {}
|
try { await cancelOrder(result.id) } catch (ex) {}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// 支付成功,确认订单上架(带重试)
|
||||||
|
try { await confirmPayment(result.id) } catch (ex) {
|
||||||
|
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 下单成功,清空购物车
|
// 下单成功,清空购物车
|
||||||
|
|
@ -226,7 +228,7 @@ export default {
|
||||||
uni.switchTab({ url: '/pages/index/index' })
|
uni.switchTab({ url: '/pages/index/index' })
|
||||||
}, 1500)
|
}, 1500)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// 错误已在 request 中处理
|
console.error('下单失败', e)
|
||||||
} finally {
|
} finally {
|
||||||
this.submitting = false
|
this.submitting = false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -227,13 +227,15 @@
|
||||||
if (result.paymentParams) {
|
if (result.paymentParams) {
|
||||||
try {
|
try {
|
||||||
await this.wxPay(result.paymentParams)
|
await this.wxPay(result.paymentParams)
|
||||||
// 支付成功,确认订单上架
|
|
||||||
try { await confirmPayment(result.id) } catch (ex) {}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// 支付失败/取消,撤销订单
|
// 支付失败/取消,撤销订单
|
||||||
try { await cancelOrder(result.id) } catch (ex) {}
|
try { await cancelOrder(result.id) } catch (ex) {}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// 支付成功,确认订单上架(带重试)
|
||||||
|
try { await confirmPayment(result.id) } catch (ex) {
|
||||||
|
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: '下单成功',
|
title: '下单成功',
|
||||||
|
|
@ -242,7 +244,9 @@
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
uni.switchTab({ url: '/pages/index/index' })
|
uni.switchTab({ url: '/pages/index/index' })
|
||||||
}, 1500)
|
}, 1500)
|
||||||
} catch (e) {} finally {
|
} catch (e) {
|
||||||
|
console.error('下单失败', e)
|
||||||
|
} finally {
|
||||||
this.submitting = false
|
this.submitting = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,6 @@ export default {
|
||||||
// 未登录跳转登录页
|
// 未登录跳转登录页
|
||||||
const token = uni.getStorageSync('token')
|
const token = uni.getStorageSync('token')
|
||||||
if (!token) {
|
if (!token) {
|
||||||
// 保存表单数据,登录后恢复
|
|
||||||
uni.setStorageSync('loginFormData', JSON.stringify(this.form))
|
uni.setStorageSync('loginFormData', JSON.stringify(this.form))
|
||||||
uni.setStorageSync('loginRedirect', '/pages/pickup/pickup')
|
uni.setStorageSync('loginRedirect', '/pages/pickup/pickup')
|
||||||
uni.navigateTo({ url: '/pages/login/login' })
|
uni.navigateTo({ url: '/pages/login/login' })
|
||||||
|
|
@ -180,6 +179,7 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.submitting = true
|
this.submitting = true
|
||||||
|
let orderId = null
|
||||||
try {
|
try {
|
||||||
const commission = parseFloat(this.form.commission)
|
const commission = parseFloat(this.form.commission)
|
||||||
const result = await createOrder({
|
const result = await createOrder({
|
||||||
|
|
@ -192,20 +192,35 @@ export default {
|
||||||
commission,
|
commission,
|
||||||
totalAmount: commission
|
totalAmount: commission
|
||||||
})
|
})
|
||||||
|
orderId = result.id
|
||||||
if (result.paymentParams) {
|
if (result.paymentParams) {
|
||||||
try {
|
try {
|
||||||
await this.wxPay(result.paymentParams)
|
await this.wxPay(result.paymentParams)
|
||||||
// 支付成功,确认订单上架
|
|
||||||
try { await confirmPayment(result.id) } catch (ex) {}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// 支付失败/取消,撤销订单
|
// 支付失败/取消,撤销订单
|
||||||
try { await cancelOrder(result.id) } catch (ex) {}
|
try { await cancelOrder(orderId) } catch (ex) {}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// 支付成功,确认订单上架(带重试)
|
||||||
|
try {
|
||||||
|
await confirmPayment(orderId)
|
||||||
|
} catch (ex) {
|
||||||
|
// confirmPayment 失败不阻塞用户,微信回调会兜底
|
||||||
|
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uni.showToast({ title: '下单成功', icon: 'success' })
|
uni.showToast({ title: '下单成功', icon: 'success' })
|
||||||
setTimeout(() => { uni.switchTab({ url: '/pages/index/index' }) }, 1500)
|
setTimeout(() => { uni.switchTab({ url: '/pages/index/index' }) }, 1500)
|
||||||
} catch (e) {} finally { this.submitting = false }
|
} catch (e) {
|
||||||
|
// createOrder 失败时给用户明确反馈
|
||||||
|
console.error('下单失败', e)
|
||||||
|
if (e?.message && !e.message.includes('网络异常')) {
|
||||||
|
// request.js 已经 showToast 了网络异常,避免重复提示
|
||||||
|
// 其他业务错误也已在 request.js 中提示,这里不再重复
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
this.submitting = false
|
||||||
|
}
|
||||||
},
|
},
|
||||||
wxPay(params) {
|
wxPay(params) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
|
||||||
|
|
@ -257,13 +257,15 @@
|
||||||
if (result.paymentParams) {
|
if (result.paymentParams) {
|
||||||
try {
|
try {
|
||||||
await this.wxPay(result.paymentParams)
|
await this.wxPay(result.paymentParams)
|
||||||
// 支付成功,确认订单上架
|
|
||||||
try { await confirmPayment(result.id) } catch (ex) {}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// 支付失败/取消,撤销订单
|
// 支付失败/取消,撤销订单
|
||||||
try { await cancelOrder(result.id) } catch (ex) {}
|
try { await cancelOrder(result.id) } catch (ex) {}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// 支付成功,确认订单上架(带重试)
|
||||||
|
try { await confirmPayment(result.id) } catch (ex) {
|
||||||
|
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: '下单成功',
|
title: '下单成功',
|
||||||
|
|
@ -272,7 +274,9 @@
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
uni.switchTab({ url: '/pages/index/index' })
|
uni.switchTab({ url: '/pages/index/index' })
|
||||||
}, 1500)
|
}, 1500)
|
||||||
} catch (e) {} finally {
|
} catch (e) {
|
||||||
|
console.error('下单失败', e)
|
||||||
|
} finally {
|
||||||
this.submitting = false
|
this.submitting = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -43,9 +43,9 @@ export function getServiceEntries() {
|
||||||
|
|
||||||
// ==================== 订单 ====================
|
// ==================== 订单 ====================
|
||||||
|
|
||||||
/** 创建订单 */
|
/** 创建订单(含微信预下单,超时适当放宽) */
|
||||||
export function createOrder(data) {
|
export function createOrder(data) {
|
||||||
return request({ url: '/api/orders', method: 'POST', data })
|
return request({ url: '/api/orders', method: 'POST', data, timeout: 30000 })
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 获取订单大厅列表 */
|
/** 获取订单大厅列表 */
|
||||||
|
|
@ -63,9 +63,15 @@ export function cancelOrder(id) {
|
||||||
return request({ url: `/api/orders/${id}/cancel`, method: 'POST' })
|
return request({ url: `/api/orders/${id}/cancel`, method: 'POST' })
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 确认支付成功(前端支付成功后调用) */
|
/** 确认支付成功(前端支付成功后调用,支持重试) */
|
||||||
export function confirmPayment(id) {
|
export function confirmPayment(id, retries = 2) {
|
||||||
return request({ url: `/api/orders/${id}/pay-confirm`, method: 'POST' })
|
return request({ url: `/api/orders/${id}/pay-confirm`, method: 'POST' }).catch(err => {
|
||||||
|
if (retries > 0) {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, 1000))
|
||||||
|
.then(() => confirmPayment(id, retries - 1))
|
||||||
|
}
|
||||||
|
throw err
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 跑腿提交完成 */
|
/** 跑腿提交完成 */
|
||||||
|
|
|
||||||
|
|
@ -49,11 +49,14 @@ function request(options) {
|
||||||
header['Authorization'] = `Bearer ${token}`
|
header['Authorization'] = `Bearer ${token}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const timeout = options.timeout ?? 15000
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
uni.request({
|
uni.request({
|
||||||
url: `${BASE_URL}${url}`,
|
url: `${BASE_URL}${url}`,
|
||||||
method,
|
method,
|
||||||
data,
|
data,
|
||||||
|
timeout,
|
||||||
header: {
|
header: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
...header
|
...header
|
||||||
|
|
|
||||||
|
|
@ -353,11 +353,11 @@ public static class OrderEndpoints
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 未完成订单:实时计算预估抽成
|
// 未完成订单:实时计算预估抽成(商品金额不抽成)
|
||||||
var rules = await db.CommissionRules.OrderBy(r => r.MinAmount).ToListAsync();
|
var rules = await db.CommissionRules.OrderBy(r => r.MinAmount).ToListAsync();
|
||||||
var fee = BusinessHelpers.CalculatePlatformFee(order.Commission, rules);
|
var fee = BusinessHelpers.CalculatePlatformFee(order.Commission, rules);
|
||||||
response.PlatformFee = fee;
|
response.PlatformFee = fee;
|
||||||
response.NetEarning = order.Commission - fee;
|
response.NetEarning = order.Commission - fee + (order.GoodsAmount ?? 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -700,7 +700,8 @@ public static class OrderEndpoints
|
||||||
{
|
{
|
||||||
var commissionRules = await db.CommissionRules.OrderBy(r => r.MinAmount).ToListAsync();
|
var commissionRules = await db.CommissionRules.OrderBy(r => r.MinAmount).ToListAsync();
|
||||||
var platformFee = BusinessHelpers.CalculatePlatformFee(order.Commission, commissionRules);
|
var platformFee = BusinessHelpers.CalculatePlatformFee(order.Commission, commissionRules);
|
||||||
var netEarning = order.Commission - platformFee;
|
// 跑腿净收益 = 佣金 - 平台抽成 + 商品金额(代购/万能帮/美食街的商品金额平台不抽成,全额给跑腿)
|
||||||
|
var netEarning = order.Commission - platformFee + (order.GoodsAmount ?? 0);
|
||||||
|
|
||||||
// 获取冻结时间配置(默认 1 天)
|
// 获取冻结时间配置(默认 1 天)
|
||||||
var freezeDaysConfig = await db.SystemConfigs.FirstOrDefaultAsync(c => c.Key == "freeze_days");
|
var freezeDaysConfig = await db.SystemConfigs.FirstOrDefaultAsync(c => c.Key == "freeze_days");
|
||||||
|
|
|
||||||
|
|
@ -158,10 +158,10 @@ public static class BusinessHelpers
|
||||||
{
|
{
|
||||||
order.Status = OrderStatus.Completed;
|
order.Status = OrderStatus.Completed;
|
||||||
|
|
||||||
// 计算佣金收益
|
// 计算佣金收益(商品金额平台不抽成,全额给跑腿)
|
||||||
var rules = await db.CommissionRules.OrderBy(r => r.MinAmount).ToListAsync();
|
var rules = await db.CommissionRules.OrderBy(r => r.MinAmount).ToListAsync();
|
||||||
var platformFee = CalculatePlatformFee(order.Commission, rules);
|
var platformFee = CalculatePlatformFee(order.Commission, rules);
|
||||||
var netEarning = order.Commission - platformFee;
|
var netEarning = order.Commission - platformFee + (order.GoodsAmount ?? 0);
|
||||||
|
|
||||||
var freezeDaysConfig = await db.SystemConfigs.FirstOrDefaultAsync(c => c.Key == "freeze_days");
|
var freezeDaysConfig = await db.SystemConfigs.FirstOrDefaultAsync(c => c.Key == "freeze_days");
|
||||||
var freezeDays = 1;
|
var freezeDays = 1;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user