1.优化渠道管理中直属投注额度和总投注额度

2.管理员管理中三个菜单数据显示限制
This commit is contained in:
2026-05-30 15:53:36 +08:00
parent 16a7ef7413
commit f6197a9af5
13 changed files with 195 additions and 92 deletions

View File

@@ -110,11 +110,12 @@ export default {
settle_stats_pending_dividend: 'Channels pending dividend',
settle_stats_pending_amount: 'Pending dividend amount',
settle_stats_paid_dividend: 'Paid dividend amount',
settle_stats_company_total_bet: 'Company total bet',
direct_bet_amount: 'Direct bet amount',
view_settlement_bet: 'View settlement bets',
direct_bet_amount_tip: 'Total bets from all players under this channel (including unsettled)',
company_bet_record_dialog_title: 'Company bet records',
direct_bet_record_dialog_title: 'Direct player game bets',
dividend_record_dialog_title: 'Paid dividend records',
direct_bet_record_dialog_title: 'Direct player bet records',
settlement_bet_record_dialog_title: 'Dividend-scope bet records',
bet_record_period_no: 'Period No.',
bet_record_user_username: 'Player',
bet_record_total_amount: 'Bet amount',

View File

@@ -109,11 +109,12 @@ export default {
settle_stats_pending_dividend: '待分红渠道',
settle_stats_pending_amount: '待分红总额',
settle_stats_paid_dividend: '已分红金额',
settle_stats_company_total_bet: '公司总投注额',
direct_bet_amount: '直属投注额',
view_settlement_bet: '查看总投注金额',
direct_bet_amount_tip: '该渠道名下全部玩家的总投注额(含未结算)',
company_bet_record_dialog_title: '公司总投注记录下注明细',
direct_bet_record_dialog_title: '直属玩家游戏下注记录',
dividend_record_dialog_title: '已分红记录',
direct_bet_record_dialog_title: '直属玩家下注记录',
settlement_bet_record_dialog_title: '分红口径下注记录',
bet_record_period_no: '游戏期号',
bet_record_user_username: '玩家名',
bet_record_total_amount: '投注金额',

View File

@@ -27,7 +27,16 @@
<el-card
shadow="never"
class="channel-stat-card"
:class="{ 'channel-stat-card-clickable': auth('viewDividendRecords') }"
:class="{ 'channel-stat-card-clickable': auth('index') }"
@click="onCompanyTotalBetCardClick"
>
<div class="label">{{ t('channel.settle_stats_company_total_bet') }}</div>
<div class="value">{{ settleStats.company_total_bet_amount }}</div>
</el-card>
<el-card
shadow="never"
class="channel-stat-card"
:class="{ 'channel-stat-card-clickable': auth('index') }"
@click="onPaidDividendCardClick"
>
<div class="label">{{ t('channel.settle_stats_paid_dividend') }}</div>
@@ -353,6 +362,7 @@
show-overflow-tooltip
/>
<el-table-column
v-if="betRecordDialog.mode === 'company'"
prop="channel_name"
:label="t('channel.bet_record_channel_name')"
min-width="100"
@@ -518,20 +528,6 @@ const dismissFloatingTooltips = () => {
}
const tableRef = useTemplateRef('tableRef')
let optButtons: OptButton[] = [
{
render: 'tipButton',
name: 'viewSettlementBet',
title: 'channel.view_settlement_bet',
text: '',
type: 'info',
icon: 'fa fa-list-alt',
class: 'table-row-view-settlement-bet',
disabledTip: false,
display: () => auth('viewSettlementBetRecords'),
click: (row: TableRow) => {
void openBetRecordDialog('settlement', row)
},
},
{
render: 'tipButton',
name: 'manualSettle',
@@ -658,6 +654,7 @@ const settleStats = reactive({
carryover_total: '0.00',
carryover_positive_total: '0.00',
paid_dividend_total: '0.00',
company_total_bet_amount: '0.00',
})
const dividendDialog = reactive({
@@ -680,7 +677,7 @@ const createBetRecordFilters = () => ({
const betRecordDialog = reactive({
visible: false,
loading: false,
mode: '' as '' | 'direct' | 'settlement',
mode: '' as '' | 'direct' | 'company',
channelId: 0,
title: '',
page: 1,
@@ -952,6 +949,7 @@ const loadSettleStats = async () => {
settleStats.carryover_total = String(res.data.carryover_total ?? '0.00')
settleStats.carryover_positive_total = String(res.data.carryover_positive_total ?? '0.00')
settleStats.paid_dividend_total = String(res.data.paid_dividend_total ?? '0.00')
settleStats.company_total_bet_amount = String(res.data.company_total_bet_amount ?? '0.00')
}
const loadDividendRecords = async () => {
@@ -973,7 +971,7 @@ const loadDividendRecords = async () => {
}
const onPaidDividendCardClick = () => {
if (!auth('viewDividendRecords')) {
if (!auth('index')) {
return
}
dividendDialog.page = 1
@@ -981,6 +979,18 @@ const onPaidDividendCardClick = () => {
void loadDividendRecords()
}
const onCompanyTotalBetCardClick = () => {
if (!auth('index')) {
return
}
resetBetRecordDialog()
betRecordDialog.mode = 'company'
betRecordDialog.channelId = 0
betRecordDialog.title = t('channel.company_bet_record_dialog_title')
betRecordDialog.visible = true
void loadBetRecords()
}
const closeDividendDialog = () => {
dividendDialog.visible = false
dividendDialog.list = []
@@ -1030,22 +1040,30 @@ const buildBetRecordFilterParams = () => {
}
const loadBetRecords = async () => {
if (!betRecordDialog.channelId || !betRecordDialog.mode) {
if (!betRecordDialog.mode) {
return
}
if (betRecordDialog.mode === 'direct' && !betRecordDialog.channelId) {
return
}
const url =
betRecordDialog.mode === 'direct' ? '/admin/channel/directBetRecordList' : '/admin/channel/settlementBetRecordList'
betRecordDialog.mode === 'direct'
? '/admin/channel/directBetRecordList'
: '/admin/channel/companyBetRecordList'
betRecordDialog.loading = true
try {
const params: Record<string, string | number> = {
page: betRecordDialog.page,
limit: betRecordDialog.limit,
...buildBetRecordFilterParams(),
}
if (betRecordDialog.mode === 'direct') {
params.channel_id = betRecordDialog.channelId
}
const res = await createAxios({
url,
method: 'get',
params: {
channel_id: betRecordDialog.channelId,
page: betRecordDialog.page,
limit: betRecordDialog.limit,
...buildBetRecordFilterParams(),
},
params,
})
if (res.code !== 1 || !res.data) {
return
@@ -1063,9 +1081,8 @@ const loadBetRecords = async () => {
}
}
const openBetRecordDialog = (mode: 'direct' | 'settlement', row: TableRow) => {
const permission = mode === 'direct' ? 'viewDirectBetRecords' : 'viewSettlementBetRecords'
if (!auth(permission)) {
const openBetRecordDialog = (mode: 'direct' | 'company', row: TableRow) => {
if (!auth('index')) {
return
}
resetBetRecordDialog()
@@ -1074,7 +1091,7 @@ const openBetRecordDialog = (mode: 'direct' | 'settlement', row: TableRow) => {
betRecordDialog.title =
mode === 'direct'
? `${t('channel.direct_bet_record_dialog_title')} - ${row.name ?? row.id}`
: `${t('channel.settlement_bet_record_dialog_title')} - ${row.name ?? row.id}`
: t('channel.company_bet_record_dialog_title')
betRecordDialog.visible = true
void loadBetRecords()
}
@@ -1234,8 +1251,8 @@ const baTable = new baTableClass(
formatter: formatAmount2,
customRenderAttr: {
tag: ({ row }: { row: TableRow }) => ({
class: auth('viewDirectBetRecords') ? 'channel-direct-bet-tag' : '',
onClick: auth('viewDirectBetRecords') ? () => openDirectBetDialog(row) : undefined,
class: auth('index') ? 'channel-direct-bet-tag' : '',
onClick: auth('index') ? () => openDirectBetDialog(row) : undefined,
}),
},
},
@@ -1382,11 +1399,20 @@ onUnmounted(() => {
.channel-stats-cards {
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 10px;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 8px;
margin-bottom: 10px;
}
.channel-stats-cards :deep(.el-card__body) {
padding: 10px 8px;
}
.channel-stat-card {
text-align: center;
min-width: 0;
}
.channel-stat-card-clickable {
cursor: pointer;
transition: box-shadow 0.2s ease;
@@ -1468,15 +1494,18 @@ onUnmounted(() => {
}
.channel-stat-card .label {
font-size: 12px;
font-size: 11px;
color: var(--el-text-color-secondary);
line-height: 1.3;
word-break: break-all;
}
.channel-stat-card .value {
margin-top: 6px;
font-size: 20px;
margin-top: 4px;
font-size: 17px;
font-weight: 600;
color: var(--el-text-color-primary);
line-height: 1.2;
}
.channel-action-row {