diff --git a/src/components/FreezeConfigPanel.vue b/src/components/FreezeConfigPanel.vue new file mode 100644 index 0000000..bdf57a9 --- /dev/null +++ b/src/components/FreezeConfigPanel.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/src/views/user/GuanliDetail.vue b/src/views/user/GuanliDetail.vue index 0679916..cd3f0a3 100644 --- a/src/views/user/GuanliDetail.vue +++ b/src/views/user/GuanliDetail.vue @@ -272,6 +272,15 @@ + + @@ -347,6 +356,7 @@ import { useRoute, useRouter } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' import { ArrowLeft } from '@element-plus/icons-vue' import request from '@/utils/request' +import FreezeConfigPanel from '@/components/FreezeConfigPanel.vue' import { cloneDeep, isEqual } from 'lodash-es' const route = useRoute() diff --git a/src/views/user/PlayerDetail.vue b/src/views/user/PlayerDetail.vue index 550b108..4ae72ed 100644 --- a/src/views/user/PlayerDetail.vue +++ b/src/views/user/PlayerDetail.vue @@ -346,6 +346,25 @@ + + + + + + + + + @@ -379,6 +398,7 @@ import { useRoute, useRouter } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' import { ArrowLeft, Edit, Check, Close, CopyDocument, Avatar } from '@element-plus/icons-vue' import request from '@/utils/request' +import FreezeConfigPanel from '@/components/FreezeConfigPanel.vue' const route = useRoute() const router = useRouter() diff --git a/src/views/user/ShangjiaDetail.vue b/src/views/user/ShangjiaDetail.vue index 5aeaf51..7f164cd 100644 --- a/src/views/user/ShangjiaDetail.vue +++ b/src/views/user/ShangjiaDetail.vue @@ -100,6 +100,15 @@ {{ formatMoney(merchant.jinyueliushui) }} + + @@ -145,6 +154,7 @@ import { useRoute, useRouter } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' import { ArrowLeft, Phone, ChatDotRound } from '@element-plus/icons-vue' import request from '@/utils/request' +import FreezeConfigPanel from '@/components/FreezeConfigPanel.vue' const route = useRoute() const router = useRouter() diff --git a/src/views/withdraw/Settings.vue b/src/views/withdraw/Settings.vue index fd40749..4286ecf 100644 --- a/src/views/withdraw/Settings.vue +++ b/src/views/withdraw/Settings.vue @@ -147,6 +147,50 @@ + + +
+
资金冻结(公共配置)
+ +
+ 全员冻结总开关 + +
+
+
{{ role.name }}
+
+ + + + + 比例 + 固定金额 + + + +
+
+
@@ -210,15 +254,41 @@ const withdrawMode = ref(2) // 默认手动提现 // 编辑时的临时变量(用于绑定 el-radio-group) const displayMode = ref(withdrawMode.value) +// 资金冻结公共配置(leixing 1/2/5/6) +const freezeRoleDefs = [ + { leixing: 1, name: '打手佣金' }, + { leixing: 2, name: '管事分红' }, + { leixing: 5, name: '打手押金' }, + { leixing: 6, name: '商家余额' } +] +const defaultFreezeRole = (leixing) => ({ + leixing, + role_enabled: false, + dongjie_mode: 1, + bili_percent: 0, + dongjie_guding_jine: 0 +}) + // 编辑数据 const editData = reactive({ rates: { ...DEFAULT_RATES }, quotas: { 1: 0, 2: 0, 3: 0 }, totalLimits: { ...DEFAULT_TOTAL_LIMITS }, orderRates: { ...DEFAULT_ORDER_RATES }, - withdrawMode: 2 + withdrawMode: 2, + dongjieQuanju: false, + dongjieRoles: freezeRoleDefs.map(r => defaultFreezeRole(r.leixing)) }) +function getFreezeRole(leixing) { + let row = editData.dongjieRoles.find(r => r.leixing === leixing) + if (!row) { + row = defaultFreezeRole(leixing) + editData.dongjieRoles.push(row) + } + return row +} + // Canvas 引用和动画 const canvasMap = ref({}) let animationId = null @@ -448,6 +518,18 @@ const fetchSettings = async () => { withdrawMode.value = mode displayMode.value = mode editData.withdrawMode = mode + editData.dongjieQuanju = !!data.dongjie_quanju_enabled + const fetchedRoles = data.dongjie_roles || [] + editData.dongjieRoles = freezeRoleDefs.map(def => { + const row = fetchedRoles.find(r => r.leixing === def.leixing) || {} + return { + leixing: def.leixing, + role_enabled: !!row.role_enabled, + dongjie_mode: row.dongjie_mode || 1, + bili_percent: parseFloat(row.dongjie_bili || 0) * 100, + dongjie_guding_jine: parseFloat(row.dongjie_guding_jine || 0), + } + }) drawAllTanks() } else if (res.code === 403) { hasPermission.value = false @@ -468,7 +550,9 @@ const enterEditMode = () => { quotas: { ...editData.quotas }, totalLimits: { ...editData.totalLimits }, orderRates: { ...editData.orderRates }, - withdrawMode: withdrawMode.value + withdrawMode: withdrawMode.value, + dongjieQuanju: editData.dongjieQuanju, + dongjieRoles: editData.dongjieRoles.map(r => ({ ...r })), } isEditMode.value = true } @@ -480,6 +564,8 @@ const cancelEdit = () => { editData.totalLimits = { ...originalData.totalLimits } editData.orderRates = { ...originalData.orderRates } editData.withdrawMode = originalData.withdrawMode + editData.dongjieQuanju = originalData.dongjieQuanju + editData.dongjieRoles = originalData.dongjieRoles.map(r => ({ ...r })) displayMode.value = originalData.withdrawMode roles.value.forEach(role => { role.rate = editData.rates[role.type] @@ -506,6 +592,15 @@ const hasSettingsChanged = () => { for (const key of [1, 2, 3, 4, 5, 6]) { if (editData.totalLimits[key] !== originalData.totalLimits[key]) return true } + if (editData.dongjieQuanju !== originalData.dongjieQuanju) return true + for (const row of editData.dongjieRoles) { + const orig = originalData.dongjieRoles.find(r => r.leixing === row.leixing) + if (!orig) return true + if (row.role_enabled !== orig.role_enabled) return true + if (row.dongjie_mode !== orig.dongjie_mode) return true + if (row.bili_percent !== orig.bili_percent) return true + if (row.dongjie_guding_jine !== orig.dongjie_guding_jine) return true + } return false } @@ -531,7 +626,15 @@ const saveSettings = async () => { quotas: { ...editData.quotas }, total_limits: { ...editData.totalLimits }, order_rates: { ...editData.orderRates }, - withdraw_mode: editData.withdrawMode + withdraw_mode: editData.withdrawMode, + dongjie_quanju_enabled: editData.dongjieQuanju, + dongjie_roles: editData.dongjieRoles.map(r => ({ + leixing: r.leixing, + role_enabled: r.role_enabled, + dongjie_mode: r.dongjie_mode, + dongjie_bili: (Number(r.bili_percent) || 0) / 100, + dongjie_guding_jine: r.dongjie_guding_jine, + })), } const res = await request.post('/houtai/htxgtxsz', payload) if (res.code === 0) { @@ -794,4 +897,35 @@ onBeforeUnmount(() => { :deep(.el-input-number .el-input__inner) { color: #fff !important; } +.freeze-settings-card { + background: rgba(10, 18, 28, 0.85); + border: 1px solid #2a6f8f; + border-radius: 16px; + padding: 20px; + margin-top: 20px; +} +.freeze-global-row { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 16px; + color: #d4e8f5; +} +.freeze-role-block { + border-top: 1px solid #2a6f8f; + padding-top: 12px; + margin-top: 12px; +} +.freeze-role-title { + font-weight: 600; + color: #6cc3e8; + margin-bottom: 8px; +} +.freeze-role-grid { + display: grid; + grid-template-columns: 60px 1fr; + gap: 8px 12px; + align-items: center; + color: #b8d4e8; +} \ No newline at end of file