From 94a8a3b76b66ccdf24f3746cd46d009cc296eb09 Mon Sep 17 00:00:00 2001 From: XingQue Date: Mon, 27 Jul 2026 19:54:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=90=E7=8E=B0=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E6=94=AF=E6=8C=81=E9=85=8D=E7=BD=AE=E5=90=84=E8=BA=AB?= =?UTF-8?q?=E4=BB=BD=E7=BD=9A=E6=AC=BE=E5=88=86=E7=BA=A2=E8=B4=B9=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后台可按客服/售后/管理员/店铺/商家配置小数费率,写入俱乐部配置。 Co-authored-by: Cursor --- src/views/withdraw/Settings.vue | 60 +++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/views/withdraw/Settings.vue b/src/views/withdraw/Settings.vue index 4e7d2a1..4990e12 100644 --- a/src/views/withdraw/Settings.vue +++ b/src/views/withdraw/Settings.vue @@ -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" + /> + + + + + +
+
罚款分红费率(按申请人身份)
+
填小数,如 0.6 = 60%。组队均摊时每个被罚人各自按该费率计算,合计等于总额×费率。
+
+
+ {{ item.name }} + {{ formatRatePercent(editData.penaltyBonusRates[item.type]) }} +
@@ -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;