佣金
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
const token = uni.getStorageSync('token')
if (!token) {
//
uni.setStorageSync('loginFormData', JSON.stringify(this.form))
uni.setStorageSync('loginRedirect', '/pages/delivery/delivery')
uni.navigateTo({ url: '/pages/login/login' }); return
}
this.submitting = true
let orderId = null
try {
const commission = parseFloat(this.form.commission)
const result = await createOrder({
@ -184,20 +184,26 @@ export default {
commission,
totalAmount: commission
})
orderId = result.id
if (result.paymentParams) {
try {
await this.wxPay(result.paymentParams)
//
try { await confirmPayment(result.id) } catch (ex) {}
} catch (e) {
// /
try { await cancelOrder(result.id) } catch (ex) {}
try { await cancelOrder(orderId) } catch (ex) {}
return
}
//
try {
await confirmPayment(orderId)
} catch (ex) {
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
}
}
uni.showToast({ title: '下单成功', icon: 'success' })
setTimeout(() => { uni.navigateBack() }, 1500)
} catch (e) {} finally { this.submitting = false }
} catch (e) {
console.error('下单失败', e)
} finally { this.submitting = false }
},
wxPay(params) {
return new Promise((resolve, reject) => {

View File

@ -210,13 +210,15 @@ export default {
if (result.paymentParams) {
try {
await this.wxPay(result.paymentParams)
//
try { await confirmPayment(result.id) } catch (ex) {}
} catch (e) {
// /
try { await cancelOrder(result.id) } catch (ex) {}
return
}
//
try { await confirmPayment(result.id) } catch (ex) {
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
}
}
//
@ -226,7 +228,7 @@ export default {
uni.switchTab({ url: '/pages/index/index' })
}, 1500)
} catch (e) {
// request
console.error('下单失败', e)
} finally {
this.submitting = false
}

View File

@ -227,13 +227,15 @@
if (result.paymentParams) {
try {
await this.wxPay(result.paymentParams)
//
try { await confirmPayment(result.id) } catch (ex) {}
} catch (e) {
// /
try { await cancelOrder(result.id) } catch (ex) {}
return
}
//
try { await confirmPayment(result.id) } catch (ex) {
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
}
}
uni.showToast({
title: '下单成功',
@ -242,7 +244,9 @@
setTimeout(() => {
uni.switchTab({ url: '/pages/index/index' })
}, 1500)
} catch (e) {} finally {
} catch (e) {
console.error('下单失败', e)
} finally {
this.submitting = false
}
},

View File

@ -172,7 +172,6 @@ export default {
//
const token = uni.getStorageSync('token')
if (!token) {
//
uni.setStorageSync('loginFormData', JSON.stringify(this.form))
uni.setStorageSync('loginRedirect', '/pages/pickup/pickup')
uni.navigateTo({ url: '/pages/login/login' })
@ -180,6 +179,7 @@ export default {
}
this.submitting = true
let orderId = null
try {
const commission = parseFloat(this.form.commission)
const result = await createOrder({
@ -192,20 +192,35 @@ export default {
commission,
totalAmount: commission
})
orderId = result.id
if (result.paymentParams) {
try {
await this.wxPay(result.paymentParams)
//
try { await confirmPayment(result.id) } catch (ex) {}
} catch (e) {
// /
try { await cancelOrder(result.id) } catch (ex) {}
try { await cancelOrder(orderId) } catch (ex) {}
return
}
//
try {
await confirmPayment(orderId)
} catch (ex) {
// confirmPayment
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
}
}
uni.showToast({ title: '下单成功', icon: 'success' })
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) {
return new Promise((resolve, reject) => {

View File

@ -257,13 +257,15 @@
if (result.paymentParams) {
try {
await this.wxPay(result.paymentParams)
//
try { await confirmPayment(result.id) } catch (ex) {}
} catch (e) {
// /
try { await cancelOrder(result.id) } catch (ex) {}
return
}
//
try { await confirmPayment(result.id) } catch (ex) {
console.warn('confirmPayment 失败,等待微信回调兜底', ex)
}
}
uni.showToast({
title: '下单成功',
@ -272,7 +274,9 @@
setTimeout(() => {
uni.switchTab({ url: '/pages/index/index' })
}, 1500)
} catch (e) {} finally {
} catch (e) {
console.error('下单失败', e)
} finally {
this.submitting = false
}
},

View File

@ -43,9 +43,9 @@ export function getServiceEntries() {
// ==================== 订单 ====================
/** 创建订单 */
/** 创建订单(含微信预下单,超时适当放宽) */
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' })
}
/** 确认支付成功(前端支付成功后调用) */
export function confirmPayment(id) {
return request({ url: `/api/orders/${id}/pay-confirm`, method: 'POST' })
/** 确认支付成功(前端支付成功后调用,支持重试) */
export function confirmPayment(id, retries = 2) {
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}`
}
const timeout = options.timeout ?? 15000
return new Promise((resolve, reject) => {
uni.request({
url: `${BASE_URL}${url}`,
method,
data,
timeout,
header: {
'Content-Type': 'application/json',
...header

View File

@ -353,11 +353,11 @@ public static class OrderEndpoints
}
else
{
// 未完成订单:实时计算预估抽成
// 未完成订单:实时计算预估抽成(商品金额不抽成)
var rules = await db.CommissionRules.OrderBy(r => r.MinAmount).ToListAsync();
var fee = BusinessHelpers.CalculatePlatformFee(order.Commission, rules);
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 platformFee = BusinessHelpers.CalculatePlatformFee(order.Commission, commissionRules);
var netEarning = order.Commission - platformFee;
// 跑腿净收益 = 佣金 - 平台抽成 + 商品金额(代购/万能帮/美食街的商品金额平台不抽成,全额给跑腿)
var netEarning = order.Commission - platformFee + (order.GoodsAmount ?? 0);
// 获取冻结时间配置(默认 1 天)
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;
// 计算佣金收益
// 计算佣金收益(商品金额平台不抽成,全额给跑腿)
var rules = await db.CommissionRules.OrderBy(r => r.MinAmount).ToListAsync();
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 freezeDays = 1;