feat: 提现设置页支持配置各身份罚款分红费率
后台可按客服/售后/管理员/店铺/商家配置小数费率,写入俱乐部配置。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user