feat: 提现设置页支持配置各身份罚款分红费率

后台可按客服/售后/管理员/店铺/商家配置小数费率,写入俱乐部配置。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-27 19:54:59 +08:00
parent dcd72b03a0
commit 94a8a3b76b

View File

@@ -144,8 +144,30 @@
v-else
v-model="editData.orderRates[item.type]"
:min="0"
:max="100"
:precision="2"
:max="1"
:step="0.01"
:precision="4"
size="small"
/>
</div>
</div>
</div>
<!-- 罚款分红费率按申请人身份组队均摊时每张罚单各自按本费率×分摊金额 -->
<div class="extra-rates-card">
<div class="card-title">罚款分红费率按申请人身份</div>
<div class="card-subtitle">填小数 0.6 = 60%组队均摊时每个被罚人各自按该费率计算合计等于总额×费率</div>
<div class="extra-rates-row">
<div v-for="item in penaltyBonusItems" :key="item.type" class="extra-rate-item">
<span class="extra-rate-label">{{ item.name }}</span>
<span v-if="!isEditMode">{{ formatRatePercent(editData.penaltyBonusRates[item.type]) }}</span>
<el-input-number
v-else
v-model="editData.penaltyBonusRates[item.type]"
:min="0"
:max="1"
:step="0.01"
:precision="4"
size="small"
/>
</div>
@@ -207,9 +229,19 @@ const orderCommissionItems = [
{ type: 13, name: '管事订单分红' }
]
// 罚款分红:与 fadan_fenhong_lilv / club_fadan_fenhong_lilv.shenfen 一致
const penaltyBonusItems = [
{ type: 1, name: '客服申请罚款' },
{ type: 2, name: '售后申请罚款' },
{ type: 3, name: '管理员申请罚款' },
{ type: 4, name: '店铺申请罚款' },
{ type: 5, name: '商家申请罚款' },
]
const DEFAULT_RATES = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0 }
const DEFAULT_TOTAL_LIMITS = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0 }
const DEFAULT_ORDER_RATES = { 1: 0, 3: 0, 12: 0, 13: 0 }
const DEFAULT_PENALTY_BONUS_RATES = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0 }
// 🆕 提现模式
const withdrawMode = ref(2) // 默认手动提现
@@ -222,6 +254,7 @@ const editData = reactive({
quotas: { 1: 0, 2: 0, 3: 0 },
totalLimits: { ...DEFAULT_TOTAL_LIMITS },
orderRates: { ...DEFAULT_ORDER_RATES },
penaltyBonusRates: { ...DEFAULT_PENALTY_BONUS_RATES },
withdrawMode: 2
})
@@ -262,6 +295,16 @@ const mergeOrderRates = (source = {}) => ({
13: source[13] ?? source['13'] ?? DEFAULT_ORDER_RATES[13]
})
const mergePenaltyBonusRates = (source = {}) => ({
...DEFAULT_PENALTY_BONUS_RATES,
...Object.fromEntries(
[1, 2, 3, 4, 5].map((key) => [
key,
Number(source[key] ?? source[String(key)] ?? DEFAULT_PENALTY_BONUS_RATES[key]) || 0,
])
),
})
const mergeTotalLimits = (source = {}) => ({
...DEFAULT_TOTAL_LIMITS,
...Object.fromEntries(
@@ -452,6 +495,7 @@ const fetchSettings = async () => {
extraTodayTotals[item.type] = data.today_totals?.[item.type] || 0
})
editData.orderRates = mergeOrderRates(data.order_rates || data.commission_rates)
editData.penaltyBonusRates = mergePenaltyBonusRates(data.penalty_bonus_rates)
const mode = data.withdraw_mode || 2
withdrawMode.value = mode
displayMode.value = mode
@@ -476,6 +520,7 @@ const enterEditMode = () => {
quotas: { ...editData.quotas },
totalLimits: { ...editData.totalLimits },
orderRates: { ...editData.orderRates },
penaltyBonusRates: { ...editData.penaltyBonusRates },
withdrawMode: withdrawMode.value
}
isEditMode.value = true
@@ -487,6 +532,7 @@ const cancelEdit = () => {
editData.quotas = { ...originalData.quotas }
editData.totalLimits = { ...originalData.totalLimits }
editData.orderRates = { ...originalData.orderRates }
editData.penaltyBonusRates = { ...originalData.penaltyBonusRates }
editData.withdrawMode = originalData.withdrawMode
displayMode.value = originalData.withdrawMode
roles.value.forEach(role => {
@@ -508,6 +554,9 @@ const hasSettingsChanged = () => {
for (const key of [1, 3, 12, 13]) {
if (editData.orderRates[key] !== originalData.orderRates[key]) return true
}
for (const key of [1, 2, 3, 4, 5]) {
if (editData.penaltyBonusRates[key] !== originalData.penaltyBonusRates[key]) return true
}
for (const key of [1, 2, 3]) {
if (editData.quotas[key] !== originalData.quotas[key]) return true
}
@@ -539,6 +588,7 @@ const saveSettings = async () => {
quotas: { ...editData.quotas },
total_limits: { ...editData.totalLimits },
order_rates: { ...editData.orderRates },
penalty_bonus_rates: { ...editData.penaltyBonusRates },
withdraw_mode: editData.withdrawMode
}
const res = await request.post(JITUAN_API.withdrawUpdate, payload)
@@ -775,6 +825,12 @@ onBeforeUnmount(() => {
padding: 20px;
margin-top: 24px;
}
.card-subtitle {
margin: -4px 0 14px;
font-size: 12px;
color: #8ab3cf;
line-height: 1.5;
}
.extra-rates-row {
display: flex;
gap: 16px;