|
|
|
@ -6,6 +6,9 @@ import API from '@/util/http.js' |
|
|
|
import moment from 'moment' |
|
|
|
import {useAdminStore} from "@/store/index.js"; |
|
|
|
import {storeToRefs} from "pinia"; |
|
|
|
// 国际化 |
|
|
|
import { useI18n } from 'vue-i18n'; |
|
|
|
const { t } = useI18n(); |
|
|
|
|
|
|
|
const adminStore = useAdminStore(); |
|
|
|
const {flag} = storeToRefs(adminStore); |
|
|
|
@ -73,7 +76,7 @@ const getGift = async function () { |
|
|
|
console.log('请求礼物列表失败', error) |
|
|
|
ElMessage({ |
|
|
|
type: 'error', |
|
|
|
message: '获取礼物列表失败,请稍后重试' |
|
|
|
message: t('elmessage.getGiftListFailed') |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
@ -95,19 +98,19 @@ const getChannel = async function () { |
|
|
|
console.log('请求频道列表失败', error) |
|
|
|
ElMessage({ |
|
|
|
type: 'error', |
|
|
|
message: '获取频道列表失败,请稍后重试' |
|
|
|
message: t('elmessage.getChannelListFailed') |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 抽离类型选项到响应式数组 |
|
|
|
const consumeTypes = ref([ |
|
|
|
{label: '发礼物', value: 1}, |
|
|
|
{label: '发红包', value: 2}, |
|
|
|
{label: '发福袋', value: 3}, |
|
|
|
{label: '付费直播', value: 4}, |
|
|
|
{label: '加入粉丝团', value: 5}, |
|
|
|
{label: '发弹幕', value: 6} |
|
|
|
{label: t('consume.consumeTypes.1'), value: 1}, |
|
|
|
{label: t('consume.consumeTypes.2'), value: 2}, |
|
|
|
{label: t('consume.consumeTypes.3'), value: 3}, |
|
|
|
{label: t('consume.consumeTypes.4'), value: 4}, |
|
|
|
{label: t('consume.consumeTypes.5'), value: 5}, |
|
|
|
{label: t('consume.consumeTypes.6'), value: 6} |
|
|
|
]) |
|
|
|
// 处理类型选择变化 |
|
|
|
const handleTypeChange = (value) => { |
|
|
|
@ -160,7 +163,7 @@ const getDept = async function () { |
|
|
|
console.log('请求地区列表失败', error) |
|
|
|
ElMessage({ |
|
|
|
type: 'error', |
|
|
|
message: '获取地区列表失败,请稍后重试' |
|
|
|
message: t('elmessage.getRegionListFailed') |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
@ -289,7 +292,7 @@ const search = function () { |
|
|
|
if (beanConsumeLive.value.jwcode) { |
|
|
|
const numRef = /^\d{1,9}$/; |
|
|
|
if (!numRef.test(beanConsumeLive.value.jwcode)) { |
|
|
|
ElMessage.error('请检查精网号格式') |
|
|
|
ElMessage.error(t('elmessage.checkJwcodeFormat')) |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
@ -435,13 +438,13 @@ const exportExcel = async function () { |
|
|
|
const res = await API({url: '/export/exportLive', data: params}); |
|
|
|
console.log('导出请求响应:', res); |
|
|
|
if (res.code === 200) { |
|
|
|
ElMessage.success('导出成功'); |
|
|
|
ElMessage.success(t('elmessage.exportSuccess')); |
|
|
|
} else { |
|
|
|
ElMessage.error(res.message || '导出失败,请稍后重试'); |
|
|
|
ElMessage.error(res.message || t('elmessage.exportFailed')); |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
console.error('导出请求出错:', error); |
|
|
|
ElMessage.error('导出失败,请稍后重试'); |
|
|
|
ElMessage.error(t('elmessage.exportFailed')); |
|
|
|
} |
|
|
|
} |
|
|
|
const exportListVisible = ref(false) |
|
|
|
@ -468,11 +471,11 @@ const getExportList = async () => { |
|
|
|
}); |
|
|
|
exportList.value = filteredData |
|
|
|
} else { |
|
|
|
ElMessage.error(result.msg || '获取导出列表失败') |
|
|
|
ElMessage.error(result.msg || t('elmessage.getExportListError')) |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
console.error('获取导出列表出错:', error) |
|
|
|
ElMessage.error('获取导出列表失败,请稍后重试') |
|
|
|
ElMessage.error(t('elmessage.getExportListError')) |
|
|
|
} finally { |
|
|
|
exportListLoading.value = false |
|
|
|
} |
|
|
|
@ -485,7 +488,7 @@ const downloadExportFile = (item) => { |
|
|
|
link.download = item.fileName |
|
|
|
link.click() |
|
|
|
} else { |
|
|
|
ElMessage.warning('文件还在导出中,请稍后再试') |
|
|
|
ElMessage.warning(t('elmessage.exportingInProgress')) |
|
|
|
} |
|
|
|
} |
|
|
|
//根据状态返回对应的标签类型 |
|
|
|
@ -507,15 +510,15 @@ const getTagType = (state) => { |
|
|
|
const getTagText = (state) => { |
|
|
|
switch (state) { |
|
|
|
case 0: |
|
|
|
return '待执行'; |
|
|
|
return t('elmessage.pendingExecution'); |
|
|
|
case 1: |
|
|
|
return '执行中'; |
|
|
|
return t('elmessage.executing'); |
|
|
|
case 2: |
|
|
|
return '执行完成'; |
|
|
|
return t('elmessage.executed'); |
|
|
|
case 3: |
|
|
|
return '执行出错'; |
|
|
|
return t('elmessage.errorExecution'); |
|
|
|
default: |
|
|
|
return '未知状态'; |
|
|
|
return t('elmessage.unknownStatus'); |
|
|
|
} |
|
|
|
} |
|
|
|
</script> |
|
|
|
@ -525,42 +528,42 @@ const getTagText = (state) => { |
|
|
|
<el-col style="margin-bottom: 1vh"> |
|
|
|
<div class="select"> |
|
|
|
<div class="selectRow"> |
|
|
|
<el-text class="text">精网号:</el-text> |
|
|
|
<el-input class="selectContent" v-model="beanConsumeLive.jwcode" placeholder="请输入精网号" clearable/> |
|
|
|
<el-text class="text">{{ t('common.jwcode') }}:</el-text> |
|
|
|
<el-input class="selectContent" v-model="beanConsumeLive.jwcode" :placeholder="t('common.jwcodePlaceholder')" clearable/> |
|
|
|
</div> |
|
|
|
<div class="selectRow"> |
|
|
|
<el-text class="text">地区:</el-text> |
|
|
|
<el-select class="selectContent" v-model="beanConsumeLive.dept" placeholder="请选择地区" clearable> |
|
|
|
<el-text class="text">{{ t('common.market') }}:</el-text> |
|
|
|
<el-select class="selectContent" v-model="beanConsumeLive.dept" :placeholder="t('common.marketPlaceholder')" clearable> |
|
|
|
<el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item"/> |
|
|
|
</el-select> |
|
|
|
</div> |
|
|
|
<div class="selectRow" style="width: 14vw;"> |
|
|
|
<el-text class="text">礼物名称:</el-text> |
|
|
|
<el-select class="selectContent" v-model="beanConsumeLive.gift" placeholder="请选择礼物名称" clearable |
|
|
|
<el-text class="text">{{ t('common.giftName') }}:</el-text> |
|
|
|
<el-select class="selectContent" v-model="beanConsumeLive.gift" :placeholder="t('common.giftNamePlaceholder')" clearable |
|
|
|
filterable |
|
|
|
allow-create default-first-option> |
|
|
|
<el-option v-for="(item, index) in gifts" :key="index" :label="item" :value="item"/> |
|
|
|
</el-select> |
|
|
|
</div> |
|
|
|
<div class="selectRow" style="width: 12vw;"> |
|
|
|
<el-text class="textB" size="large">频道:</el-text> |
|
|
|
<el-select class="selectContent" v-model="beanConsumeLive.liveChannel" placeholder="请选择频道" clearable |
|
|
|
<div class="selectRow" style="min-width: 12vw;"> |
|
|
|
<el-text class="textB" size="large">{{ t('common.channel') }}:</el-text> |
|
|
|
<el-select class="selectContent" v-model="beanConsumeLive.liveChannel" :placeholder="t('common.channelPlaceholder')" clearable |
|
|
|
filterable allow-create default-first-option> |
|
|
|
<el-option v-for="(item, index) in channels" :key="index" :label="item" :value="item"/> |
|
|
|
</el-select> |
|
|
|
</div> |
|
|
|
<div class="selectRow" style="width: 12vw;"> |
|
|
|
<el-text class="textB" size="large">直播间:</el-text> |
|
|
|
<el-input class="selectContent" v-model="beanConsumeLive.liveName" placeholder="请输入直播间" clearable/> |
|
|
|
<div class="selectRow" style="min-width: 12vw;"> |
|
|
|
<el-text class="textB" size="large">{{ t('common.liveRoom') }}:</el-text> |
|
|
|
<el-input class="selectContent" v-model="beanConsumeLive.liveName" :placeholder="t('common.liveRoomPlaceholder')" clearable/> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</el-col> |
|
|
|
<el-col> |
|
|
|
<div class="select"> |
|
|
|
<div class="selectRow" style="width: 31.4vw;"> |
|
|
|
<el-text class="text">消费时间:</el-text> |
|
|
|
<el-date-picker class="selectContent" v-model="getTime" type="datetimerange" range-separator="至" |
|
|
|
start-placeholder="起始时间" end-placeholder="结束时间" style="margin-right:1vw;width:480px" |
|
|
|
<el-text class="text">{{ t('common.consumetime') }}:</el-text> |
|
|
|
<el-date-picker class="selectContent" v-model="getTime" type="datetimerange" :range-separator="t('common.to')" |
|
|
|
:start-placeholder="t('common.startTime')" :end-placeholder="t('common.endTime')" style="margin-right:1vw;width:480px" |
|
|
|
@change="handleDatePickerChange" :default-time="defaultTime"/> |
|
|
|
<div v-if="false"> |
|
|
|
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"> 今</el-button> |
|
|
|
@ -569,24 +572,24 @@ const getTagText = (state) => { |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="selectRow" style="justify-content: flex-start;"> |
|
|
|
<el-button type="primary" @click="search()">查询</el-button> |
|
|
|
<el-button type="primary" @click="exportExcel()">导出excel</el-button> |
|
|
|
<el-button type="primary" @click="openExportList">查看导出列表</el-button> |
|
|
|
<el-button type="success" @click="reset()">重置</el-button> |
|
|
|
<el-button type="primary" @click="search()">{{ t('common.search') }}</el-button> |
|
|
|
<el-button type="primary" @click="exportExcel()">{{ t('common.exportExcel') }}</el-button> |
|
|
|
<el-button type="primary" @click="openExportList">{{ t('common.viewExportList') }}</el-button> |
|
|
|
<el-button type="success" @click="reset()">{{ t('common.reset') }}</el-button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</el-col> |
|
|
|
</el-card> |
|
|
|
<el-card class="card2"> |
|
|
|
<div class="goldStatistics"> |
|
|
|
金豆总数:{{ format3(Math.abs(permanentBean + freeBean)) }} |
|
|
|
付费金豆数:{{ format3(Math.abs(permanentBean)) }} |
|
|
|
免费金豆数:{{ format3(Math.abs(freeBean)) }} |
|
|
|
{{ t('common.totalGoldBean') }}{{ format3(Math.abs(permanentBean + freeBean)) }} |
|
|
|
{{ t('common.payGoldBean') }}{{ format3(Math.abs(permanentBean)) }} |
|
|
|
{{ t('common.freeGoldBean') }}{{ format3(Math.abs(freeBean)) }} |
|
|
|
</div> |
|
|
|
<div style="overflow-y: auto"> |
|
|
|
<el-table :data="tableData" style="width: 82vw" height="56vh" @sort-change="handleSortChange" |
|
|
|
<el-table :data="tableData" style="width: 82vw" height="65vh" @sort-change="handleSortChange" |
|
|
|
:row-style="{ height: '50px' }"> |
|
|
|
<el-table-column type="index" label="序号" width="80px" fixed="left"> |
|
|
|
<el-table-column type="index" :label="t('common_list.id')" width="80px" fixed="left"> |
|
|
|
<template #default="scope"> |
|
|
|
<span>{{ |
|
|
|
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize |
|
|
|
@ -594,23 +597,23 @@ const getTagText = (state) => { |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<!-- 固定姓名列 --> |
|
|
|
<el-table-column prop="name" label="姓名" width="150px" fixed="left" show-overflow-tooltip/> |
|
|
|
<el-table-column prop="name" :label="t('common_list.name')" width="150px" fixed="left" show-overflow-tooltip/> |
|
|
|
<!-- 固定精网号列 --> |
|
|
|
<el-table-column prop="jwcode" label="精网号" width="110px" fixed="left"/> |
|
|
|
<el-table-column prop="dept" label="地区" width="110px"/> |
|
|
|
<el-table-column prop="gift" label="礼物" width="140px"> |
|
|
|
<el-table-column prop="jwcode" :label="t('common_list.jwcode')" width="110px" fixed="left"/> |
|
|
|
<el-table-column prop="dept" :label="t('common_list.market')" width="110px"/> |
|
|
|
<el-table-column prop="gift" :label="t('common_list.gift')" width="150px"> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column prop="beanNum" label="金豆数量" sortable="custom" width="120px"/> |
|
|
|
<el-table-column prop="isBackpack" label="背包礼物" width="120px"> |
|
|
|
<el-table-column prop="beanNum" :label="t('common_list.beanNum')" sortable="custom" width="120px"/> |
|
|
|
<el-table-column prop="isBackpack" :label="t('common_list.isBackpack')" width="120px"> |
|
|
|
<template #default="scope"> |
|
|
|
{{ scope.row.isBackpack == 1 ? '是' : '否' }} |
|
|
|
{{ scope.row.isBackpack == 1 ? t('common_list.yes') : t('common_list.no') }} |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column prop="buyBean" label="付费金豆数" sortable="custom" width="120px"/> |
|
|
|
<el-table-column prop="freeBean" label="免费金豆数" sortable="custom" width="120px"/> |
|
|
|
<el-table-column prop="liveChannel" label="频道" width="120px" show-overflow-tooltip/> |
|
|
|
<el-table-column prop="liveName" label="直播间名称" width="160px" show-overflow-tooltip/> |
|
|
|
<el-table-column prop="consumeTime" label="消费时间" sortable="custom" width="180px"/> |
|
|
|
<el-table-column prop="buyBean" :label="t('common_list.permanentBean')" sortable="custom" width="120px"/> |
|
|
|
<el-table-column prop="freeBean" :label="t('common_list.freeBean')" sortable="custom" width="120px"/> |
|
|
|
<el-table-column prop="liveChannel" :label="t('common_list.channel')" width="120px" show-overflow-tooltip/> |
|
|
|
<el-table-column prop="liveName" :label="t('common_list.liveRoomName')" width="160px" show-overflow-tooltip/> |
|
|
|
<el-table-column prop="consumeTime" :label="t('common_list.consumetime')" sortable="custom" width="190px"/> |
|
|
|
</el-table> |
|
|
|
</div> |
|
|
|
<el-pagination background :current-page="getObj.pageNum" :page-size="getObj.pageSize" |
|
|
|
@ -620,33 +623,33 @@ const getTagText = (state) => { |
|
|
|
</el-card> |
|
|
|
|
|
|
|
<!-- 导出弹窗 --> |
|
|
|
<el-dialog v-model="exportListVisible" title="导出列表" width="80%"> |
|
|
|
<el-dialog v-model="exportListVisible" :title="t('common_export.exportList')" width="80%"> |
|
|
|
<el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading"> |
|
|
|
<el-table-column prop="fileName" label="文件名"/> |
|
|
|
<el-table-column prop="state" label="状态"> |
|
|
|
<el-table-column prop="fileName" :label="t('common_export.fileName')"/> |
|
|
|
<el-table-column prop="state" :label="t('common_export.status')"> |
|
|
|
<template #default="scope"> |
|
|
|
<el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'"> |
|
|
|
{{ getTagText(scope.row.state) }} |
|
|
|
</el-tag> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column prop="createTime" label="创建时间"> |
|
|
|
<el-table-column prop="createTime" :label="t('common_export.createTime')"> |
|
|
|
<template #default="scope"> |
|
|
|
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }} |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
<el-table-column label="操作"> |
|
|
|
<el-table-column :label="t('common_export.operation')"> |
|
|
|
<template #default="scope"> |
|
|
|
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)" |
|
|
|
:disabled="scope.row.state !== 2"> |
|
|
|
下载 |
|
|
|
{{ t('common_export.download') }} |
|
|
|
</el-button> |
|
|
|
</template> |
|
|
|
</el-table-column> |
|
|
|
</el-table> |
|
|
|
<template #footer> |
|
|
|
<div class="dialog-footer"> |
|
|
|
<el-button text @click="exportListVisible = false">关闭</el-button> |
|
|
|
<el-button text @click="exportListVisible = false">{{ t('common_export.close') }}</el-button> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
</el-dialog> |
|
|
|
@ -711,7 +714,7 @@ const getTagText = (state) => { |
|
|
|
padding: 0 0.5vw; |
|
|
|
|
|
|
|
.text { |
|
|
|
width: 5vw; |
|
|
|
width: 5.3vw; |
|
|
|
font-size: 15px; |
|
|
|
} |
|
|
|
|
|
|
|
|