Browse Source

消费导出完成,bug改完

feat/lhl
lihuilin 2 weeks ago
parent
commit
35a5413266
  1. 212
      gold-system/src/views/goldBeen/goldenBeenConsum.vue
  2. 5
      gold-system/src/views/managerecharge/rate.vue
  3. 10
      gold-system/src/views/recharge/allRecharge.vue
  4. 48
      gold-system/src/views/usergoldInfo/index.vue
  5. 2
      gold-system/stats.html

212
gold-system/src/views/goldBeen/goldenBeenConsum.vue

@ -92,6 +92,7 @@
<el-button @click="get7Days()">近7天</el-button> <el-button @click="get7Days()">近7天</el-button>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="success" @click="exportExcel">导出Excel</el-button>
<el-button type="primary" @click="search">查询</el-button> <el-button type="primary" @click="search">查询</el-button>
<el-button type="success" @click="reset(ruleFormRef)">重置</el-button> <el-button type="success" @click="reset(ruleFormRef)">重置</el-button>
</el-form-item> </el-form-item>
@ -164,13 +165,70 @@
</el-pagination> </el-pagination>
</div> </div>
</div> </div>
<!-- 导出信息确认对话框 -->
<el-dialog
v-model="showExportInfoPanel"
title="导出信息确认"
width="400px"
:close-on-click-modal="false"
>
<div class="info-panel-header">导出信息</div>
<div v-if="!detailY.jwcode && !detailY.ipAddress && !detailY.sourceType && !detailY.sourceName && (!detailY.startTime || !detailY.endTime)">
你正在导出所有数据
</div>
<div v-else>
你正在导出以下数据
</div>
<div v-if="detailY.jwcode">精网号{{ detailY.jwcode }}</div>
<div v-if="detailY.ipAddress">地区{{ detailY.ipAddress }}</div>
<div v-if="detailY.sourceType">
消费类型{{ consumList.value.find(item => item.value === detailY.sourceType)?.text }}
</div>
<div v-if="detailY.sourceName">直播间{{ detailY.sourceName }}</div>
<div v-if="detailY.startTime && detailY.endTime">
时间范围{{ detailY.startTime }} {{ detailY.endTime }}
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="showExportInfoPanel = false">取消</el-button>
<el-button type="primary" @click="doExportExcel">导出</el-button>
</span>
</template>
</el-dialog>
<!-- 导出进度对话框 -->
<el-dialog
v-model="isExporting"
title="正在导出"
width="400px"
:close-on-click-modal="false"
:show-close="false"
>
<el-progress
:percentage="exportProgress"
:stroke-width="15"
striped
animated
/>
<div class="export-status">
已导出 {{ Math.round((exportProgress / 100) * total) }} / {{ total }}
</div>
<template #footer>
<el-button type="danger" @click="cancelExport">取消导出</el-button>
</template>
</el-dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref } from 'vue'
import type { FormInstance } from 'element-plus' import type { FormInstance } from 'element-plus'
// import { ElMessage } from 'element-plus'
import { ElMessage } from 'element-plus'
import moment from 'moment' import moment from 'moment'
import API from '@/util/http' import API from '@/util/http'
import axios from 'axios'
// xlsx
import * as XLSX from 'xlsx'
const { utils, writeFile } = XLSX
// //
const tableData = ref([]) const tableData = ref([])
@ -332,6 +390,158 @@ const getArea = async () => {
console.log('请求失败', error) console.log('请求失败', error)
} }
} }
//
const showExportInfoPanel = ref(false)
const exportProgress = ref(0)
const isExporting = ref(false)
const exportCancelToken = ref<any>(null)
// Excel
const headers = [
'序号',
'姓名',
'精网号',
'地区',
'消费类型',
'金豆价格',
'直播间',
'消费时间'
]
//
const exportExcel = () => {
showExportInfoPanel.value = true
}
//
const doExportExcel = async () => {
try {
isExporting.value = true
exportProgress.value = 0
showExportInfoPanel.value = false
// Excel
const wb = utils.book_new()
const ws = utils.aoa_to_sheet([headers])
utils.book_append_sheet(wb, ws, 'Sheet1')
//
const writer = {
write: (d: any[][], o: any) => {
if (!d) return
utils.sheet_add_aoa(ws, d, { origin: -1 })
}
}
let page = 1
let totalExported = 0
const pageSize = 5000 // 5000
let totalRecords = 0
//
const firstResult = await API({
url: '/dou/getSpend',
method: 'post',
data: {
pageNum: 1,
pageSize,
spend: {
...detailY.value
}
}
})
totalRecords = firstResult.data.total
//
const CancelToken = axios.CancelToken
exportCancelToken.value = CancelToken.source()
//
const firstData = firstResult.data.list
if (firstData.length) {
const rows = firstData.map((row: any, index: number) => {
return [
totalExported + index + 1,
row.nickname || '',
row.jwcode || '',
row.ipAddress || '',
consumList.value.find(item => item.value === row.sourceType)?.text || '',
row.jinbiCostTotal || 0,
row.room || '',
moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') || ''
]
})
writer.write(rows,{})
totalExported += firstData.length
exportProgress.value = Math.round((totalExported / totalRecords) * 100)
page++
}
while (totalExported < totalRecords) {
const result = await API({
url: '/dou/getSpend',
method: 'post',
data: {
pageNum: page,
pageSize,
spend: {
...detailY.value
}
},
cancelToken: exportCancelToken.value.token
})
const data = result.data.list
if (!data.length) break
//
const rows = data.map((row: any, index: number) => [
totalExported + index + 1,
row.nickname || '',
row.jwcode || '',
row.ipAddress || '',
consumList.value.find(item => item.value === row.sourceType)?.text || '',
row.jinbiCostTotal || 0,
row.room || '',
moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') || ''
])
//
writer.write(rows,{})
totalExported += data.length
exportProgress.value = Math.round((totalExported / totalRecords) * 100)
// 500
if (page % 500 === 0) {
await new Promise(resolve => setTimeout(resolve, 0))
}
page++
}
//
writeFile(wb, '金豆消费明细.xlsx')
exportProgress.value = 100
isExporting.value = false
exportCancelToken.value = null
ElMessage.success(`导出成功,共${totalExported}条数据`)
} catch (error) {
if (!axios.isCancel(error)) {
ElMessage.error(`导出失败: ${error.message}`)
}
isExporting.value = false
exportCancelToken.value = null
}
}
//
const cancelExport = () => {
if (exportCancelToken.value) {
exportCancelToken.value.cancel('用户取消导出')
ElMessage.warning('导出已取消')
isExporting.value = false
}
}
// //
getInit() getInit()
getCount() getCount()

5
gold-system/src/views/managerecharge/rate.vue

@ -186,6 +186,11 @@ const addRate = async function () {
}) })
if (result.code == 0) { if (result.code == 0) {
ElMessage.error(result.msg) ElMessage.error(result.msg)
}else{
ElMessage({
type: 'success',
message: '新增汇率成功'
})
} }
// //
console.log('请求成功', result) console.log('请求成功', result)

10
gold-system/src/views/recharge/allRecharge.vue

@ -421,7 +421,7 @@ const handleSortChange = (column) => {
<el-col> <el-col>
<el-card style="margin-bottom: 20px"> <el-card style="margin-bottom: 20px">
<el-row style="margin-bottom: 10px"> <el-row style="margin-bottom: 10px">
<el-col :span="8">
<el-col :span="6">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text> <el-text class="mx-1" size="large">活动名称</el-text>
<el-select <el-select
@ -440,8 +440,8 @@ const handleSortChange = (column) => {
</el-select> </el-select>
</div> </div>
</el-col> </el-col>
<el-col :span="8">
<!-- <div class="head-card-element">
<!-- <el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值方式</el-text> <el-text class="mx-1" size="large">充值方式</el-text>
<el-select <el-select
v-model="rechargeVo.rechargeWay" v-model="rechargeVo.rechargeWay"
@ -457,8 +457,8 @@ const handleSortChange = (column) => {
:value="item" :value="item"
/> />
</el-select> </el-select>
</div> -->
</el-col>
</div>
</el-col>-->
<el-col :span="8"> <el-col :span="8">
<div class="head-card-element" v-if="adminData.area == '总部'"> <div class="head-card-element" v-if="adminData.area == '总部'">
<el-text class="mx-1" size="large">所属地区</el-text> <el-text class="mx-1" size="large">所属地区</el-text>

48
gold-system/src/views/usergoldInfo/index.vue

@ -78,7 +78,6 @@ const updateType = [
const get = async function (val) { const get = async function (val) {
try { try {
// //
//
if (adminData.value.area === '泰国') { if (adminData.value.area === '泰国') {
detailY.value.areas = ['泰国', '越南'] detailY.value.areas = ['泰国', '越南']
} else if (adminData.value.area !== '总部') { } else if (adminData.value.area !== '总部') {
@ -90,7 +89,7 @@ const get = async function (val) {
} }
// //
if (getTime.value != null) { if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
if (getTime.value[0] != '' && getTime.value[1] != '') {
detailY.value.startDate = getTime.value[0] detailY.value.startDate = getTime.value[0]
detailY.value.endDate = getTime.value[1] detailY.value.endDate = getTime.value[1]
} }
@ -115,23 +114,34 @@ const get = async function (val) {
detailY: { ...detailY.value } detailY: { ...detailY.value }
} }
}) })
//
console.log('请求成功', result)
// console.log("2", result2);
//
tableData.value = result.data.list
console.log('tableData', tableData.value)
tableAllData.value = result2.data
// 100
//
rechargeCoin.value = parseFloat((tableAllData.value.sumR / 100).toFixed(2))
freeCoin.value = parseFloat((tableAllData.value.sumF / 100).toFixed(2))
taskCoin.value = parseFloat((tableAllData.value.sumT / 100).toFixed(2))
// console.log("tableAllData", tableAllData.value);
//
total.value = result.data.total
console.log('total', total.value)
// result.data.list
if (result.data.list.length === 0) {
//
tableData.value = []
// 0
rechargeCoin.value = 0
freeCoin.value = 0
taskCoin.value = 0
// null
tableAllData.value = null
// 0
total.value = 0
// ElMessage.warning('')
} else {
//
console.log('请求成功', result)
//
tableData.value = result.data.list
console.log('tableData', tableData.value)
tableAllData.value = result2.data
// 100
rechargeCoin.value = parseFloat((tableAllData.value.sumR / 100).toFixed(2))
freeCoin.value = parseFloat((tableAllData.value.sumF / 100).toFixed(2))
taskCoin.value = parseFloat((tableAllData.value.sumT / 100).toFixed(2))
//
total.value = result.data.total
console.log('total', total.value)
}
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
// //

2
gold-system/stats.html
File diff suppressed because it is too large
View File

Loading…
Cancel
Save