佣金
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
18631081161 2026-04-05 14:10:51 +08:00
parent 70c37c4ad6
commit 3f23dee33f
9 changed files with 71 additions and 30 deletions

View File

@ -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) => {

View File

@ -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
} }

View File

@ -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
} }
}, },

View File

@ -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) => {

View File

@ -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
} }
}, },

View File

@ -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
})
} }
/** 跑腿提交完成 */ /** 跑腿提交完成 */

View File

@ -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

View File

@ -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");

View File

@ -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;