feat: 提现设置页支持配置各身份罚款分红费率
后台可按客服/售后/管理员/店铺/商家配置小数费率,写入俱乐部配置。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -144,8 +144,30 @@
|
|||||||
v-else
|
v-else
|
||||||
v-model="editData.orderRates[item.type]"
|
v-model="editData.orderRates[item.type]"
|
||||||
:min="0"
|
:min="0"
|
||||||
:max="100"
|
:max="1"
|
||||||
:precision="2"
|
: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"
|
size="small"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -207,9 +229,19 @@ const orderCommissionItems = [
|
|||||||
{ type: 13, name: '管事订单分红' }
|
{ 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_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_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_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) // 默认手动提现
|
const withdrawMode = ref(2) // 默认手动提现
|
||||||
@@ -222,6 +254,7 @@ const editData = reactive({
|
|||||||
quotas: { 1: 0, 2: 0, 3: 0 },
|
quotas: { 1: 0, 2: 0, 3: 0 },
|
||||||
totalLimits: { ...DEFAULT_TOTAL_LIMITS },
|
totalLimits: { ...DEFAULT_TOTAL_LIMITS },
|
||||||
orderRates: { ...DEFAULT_ORDER_RATES },
|
orderRates: { ...DEFAULT_ORDER_RATES },
|
||||||
|
penaltyBonusRates: { ...DEFAULT_PENALTY_BONUS_RATES },
|
||||||
withdrawMode: 2
|
withdrawMode: 2
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -262,6 +295,16 @@ const mergeOrderRates = (source = {}) => ({
|
|||||||
13: source[13] ?? source['13'] ?? DEFAULT_ORDER_RATES[13]
|
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 = {}) => ({
|
const mergeTotalLimits = (source = {}) => ({
|
||||||
...DEFAULT_TOTAL_LIMITS,
|
...DEFAULT_TOTAL_LIMITS,
|
||||||
...Object.fromEntries(
|
...Object.fromEntries(
|
||||||
@@ -452,6 +495,7 @@ const fetchSettings = async () => {
|
|||||||
extraTodayTotals[item.type] = data.today_totals?.[item.type] || 0
|
extraTodayTotals[item.type] = data.today_totals?.[item.type] || 0
|
||||||
})
|
})
|
||||||
editData.orderRates = mergeOrderRates(data.order_rates || data.commission_rates)
|
editData.orderRates = mergeOrderRates(data.order_rates || data.commission_rates)
|
||||||
|
editData.penaltyBonusRates = mergePenaltyBonusRates(data.penalty_bonus_rates)
|
||||||
const mode = data.withdraw_mode || 2
|
const mode = data.withdraw_mode || 2
|
||||||
withdrawMode.value = mode
|
withdrawMode.value = mode
|
||||||
displayMode.value = mode
|
displayMode.value = mode
|
||||||
@@ -476,6 +520,7 @@ const enterEditMode = () => {
|
|||||||
quotas: { ...editData.quotas },
|
quotas: { ...editData.quotas },
|
||||||
totalLimits: { ...editData.totalLimits },
|
totalLimits: { ...editData.totalLimits },
|
||||||
orderRates: { ...editData.orderRates },
|
orderRates: { ...editData.orderRates },
|
||||||
|
penaltyBonusRates: { ...editData.penaltyBonusRates },
|
||||||
withdrawMode: withdrawMode.value
|
withdrawMode: withdrawMode.value
|
||||||
}
|
}
|
||||||
isEditMode.value = true
|
isEditMode.value = true
|
||||||
@@ -487,6 +532,7 @@ const cancelEdit = () => {
|
|||||||
editData.quotas = { ...originalData.quotas }
|
editData.quotas = { ...originalData.quotas }
|
||||||
editData.totalLimits = { ...originalData.totalLimits }
|
editData.totalLimits = { ...originalData.totalLimits }
|
||||||
editData.orderRates = { ...originalData.orderRates }
|
editData.orderRates = { ...originalData.orderRates }
|
||||||
|
editData.penaltyBonusRates = { ...originalData.penaltyBonusRates }
|
||||||
editData.withdrawMode = originalData.withdrawMode
|
editData.withdrawMode = originalData.withdrawMode
|
||||||
displayMode.value = originalData.withdrawMode
|
displayMode.value = originalData.withdrawMode
|
||||||
roles.value.forEach(role => {
|
roles.value.forEach(role => {
|
||||||
@@ -508,6 +554,9 @@ const hasSettingsChanged = () => {
|
|||||||
for (const key of [1, 3, 12, 13]) {
|
for (const key of [1, 3, 12, 13]) {
|
||||||
if (editData.orderRates[key] !== originalData.orderRates[key]) return true
|
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]) {
|
for (const key of [1, 2, 3]) {
|
||||||
if (editData.quotas[key] !== originalData.quotas[key]) return true
|
if (editData.quotas[key] !== originalData.quotas[key]) return true
|
||||||
}
|
}
|
||||||
@@ -539,6 +588,7 @@ const saveSettings = async () => {
|
|||||||
quotas: { ...editData.quotas },
|
quotas: { ...editData.quotas },
|
||||||
total_limits: { ...editData.totalLimits },
|
total_limits: { ...editData.totalLimits },
|
||||||
order_rates: { ...editData.orderRates },
|
order_rates: { ...editData.orderRates },
|
||||||
|
penalty_bonus_rates: { ...editData.penaltyBonusRates },
|
||||||
withdraw_mode: editData.withdrawMode
|
withdraw_mode: editData.withdrawMode
|
||||||
}
|
}
|
||||||
const res = await request.post(JITUAN_API.withdrawUpdate, payload)
|
const res = await request.post(JITUAN_API.withdrawUpdate, payload)
|
||||||
@@ -775,6 +825,12 @@ onBeforeUnmount(() => {
|
|||||||
padding: 20px;
|
padding: 20px;
|
||||||
margin-top: 24px;
|
margin-top: 24px;
|
||||||
}
|
}
|
||||||
|
.card-subtitle {
|
||||||
|
margin: -4px 0 14px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #8ab3cf;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
.extra-rates-row {
|
.extra-rates-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 16px;
|
gap: 16px;
|
||||||
|
|||||||
Reference in New Issue
Block a user