Browse Source

Merge branch 'zhangyong/feature-20250716164232-金币前端' into milestone-20250711-金币前端二期

zhangrenyuan/feature-20250714163943-金币前端二期
zhangyongQINGHU 2 weeks ago
parent
commit
5d4914c4b3
  1. 4
      .env.development
  2. 4
      .env.production
  3. 3
      .env.test
  4. 163
      src/views/consume/coinConsumeDetail.vue
  5. 8
      src/views/home.vue
  6. 306
      src/views/permissions/permission.vue
  7. 161
      src/views/recharge/coinRechargeDetail.vue
  8. 165
      src/views/refund/coinRefundDetail.vue
  9. 168
      src/views/usergold/clientCountBalance.vue
  10. 177
      src/views/usergold/clientCountDetail.vue
  11. 85
      src/views/workspace/index.vue

4
.env.development

@ -1,3 +1,5 @@
VITE_API_BASE='https://hwjb.homilychart.com/dev/admin'
# VITE_API_BASE='https://hwjb.homilychart.com/dev/admin'
VITE_UPLOAD_URL=http://39.101.133.168:8828/hljw/api/aws/upload
# VITE_API_BASE='http://192.168.9.21:8081/'
VITE_API_BASE='http://18.143.76.3:10704/'

4
.env.production

@ -1,3 +1,3 @@
VITE_API_BASE='https://hwjb.homilychart.com/prod'
# VITE_API_BASE='http://192.168.8.232:8080/'
# VITE_API_BASE='https://hwjb.homilychart.com/prod'
VITE_API_BASE='http://192.168.8.246:8081/'
VITE_UPLOAD_URL=https://api.homilychart.com/hljw/api/aws/upload

3
.env.test

@ -1,4 +1,5 @@
# VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_prod'
VITE_API_BASE='https://hwjb.homilychart.com/dev/admin/'
# VITE_API_BASE='https://hwjb.homilychart.com/dev/admin/'
# VITE_API_BASE='http://18.143.76.3:10704/'
VITE_API_BASE='http://192.168.8.246:8081/'
VITE_UPLOAD_URL=https://api.homilychart.com/hljw/api/aws/upload

163
src/views/consume/coinConsumeDetail.vue

@ -3,6 +3,7 @@ import {computed, onMounted, ref} from 'vue'
import {dayjs, ElMessage} from 'element-plus'
import request from '@/util/http'
import API from '@/util/http'
import moment from 'moment'
//
/*
@ -393,24 +394,7 @@ const handleSortChange = (column) => {
sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
ConsumeSelectBy()
}
const exportExcel = async function () {
const params = {
consumUser: {
jwcode: consumeUser.value.jwcode || '',
payPlatform: consumeUser.value.payPlatform || '',
market: consumeUser.value.market || '',
startTime: consumeUser.value.startTime || '',
endTime: consumeUser.value.endTime || '',
goodsName: consumeUser.value.goodsName || ''
},
page: getObj.pageNum,
size: getObj.pageSize
}
const res = await API({url: '/export/exportConsume', data: params})
if (res.code === 200) {
ElMessage.success('导出成功')
}
}
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
ConsumeSelectBy()
@ -445,6 +429,97 @@ onMounted(async function () {
})
const exportExcel = async function () {
const params = {
consumUser: {
jwcode: consumeUser.value.jwcode || '',
payPlatform: consumeUser.value.payPlatform || '',
market: consumeUser.value.market || '',
startTime: consumeUser.value.startTime || '',
endTime: consumeUser.value.endTime || '',
goodsName: consumeUser.value.goodsName || ''
},
page: getObj.value.pageNum,
size: total.value
}
const res = await API({url: '/export/exportConsume', data: params})
if (res.code === 200) {
ElMessage.success('导出成功')
}
}
const exportListVisible = ref(false)
//
const openExportList = () => {
getExportList()
exportListVisible.value = true
}
//
const exportList = ref([])
//
const exportListLoading = ref(false)
//
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 4; //4
});
exportList.value = filteredData
} else {
ElMessage.error(result.msg || '获取导出列表失败')
}
} catch (error) {
console.error('获取导出列表出错:', error)
ElMessage.error('获取导出列表失败,请稍后重试')
} finally {
exportListLoading.value = false
}
}
//
const downloadExportFile = (item) => {
if (item.state === 2) {
const link = document.createElement('a')
link.href = item.url
link.download = item.fileName
link.click()
} else {
ElMessage.warning('文件还在导出中,请稍后再试')
}
}
//
const getTagType = (state) => {
switch (state) {
case 0:
return 'info';
case 1:
return 'primary';
case 2:
return'success';
case 3:
return 'danger';
default:
return 'info';
}
}
//
const getTagText = (state) => {
switch (state) {
case 0:
return '待执行';
case 1:
return '执行中';
case 2:
return'执行完成';
case 3:
return '执行出错';
default:
return '未知状态';
}
}
</script>
<template>
@ -452,12 +527,15 @@ onMounted(async function () {
<el-col>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 10px">
<el-col :span="6">
<div class="head-card-element">
<el-text size="large">精网号</el-text>
<el-input v-model="consumeUser.jwcode" placeholder="请输入精网号" size="large" style="width: 240px"
clearable>
</el-input>
<el-col :span="5">
<div class="head-card-element">
<el-text class="mx-1" >精网号</el-text>
<el-input
v-model="consumeUser.jwcode"
placeholder="请输入精网号"
style="width: 150px"
clearable
/>
</div>
</el-col>
<el-col :span="6">
@ -491,7 +569,7 @@ onMounted(async function () {
</el-col>
</el-row>
<el-row>
<el-col :span="21">
<el-col :span="24">
<div class="head-card-element">
<el-text class="mx-1" size="large">消耗时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
@ -505,8 +583,8 @@ onMounted(async function () {
<div class="head-card-btn"> -->
<el-button type="success" @click="reset()">重置</el-button>
<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>
</div>
</el-col>
</el-row>
@ -592,6 +670,39 @@ onMounted(async function () {
</el-card>
</el-col>
</el-row>
<!-- 导出弹窗 -->
<el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100%" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<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="创建时间">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button text @click="exportListVisible = false">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>

8
src/views/home.vue

@ -130,7 +130,7 @@ function logout() {
//
onMounted(async function () {
//
getAdminData()
//getAdminData()
//
await getExportList()
})
@ -255,10 +255,7 @@ const openChangePassword = () => {
<el-menu class="el-menu-demo" mode="horizontal" :ellipsis="false">
<el-badge @click="openExportList" class="item" > <!-- 用的el-badgeBadge 徽章 之后可以加数字 -->
<el-button>查看导出列表</el-button>
</el-badge>
<el-sub-menu index="1" class="admin">
<template #title>
<el-image :src="imgrule1" alt="错误" style="width: 50px; height: 50px" />
@ -267,7 +264,6 @@ const openChangePassword = () => {
<el-menu-item @click="message()">查看个人信息</el-menu-item>
<el-menu-item @click="openChangePassword">修改密码</el-menu-item>
<el-menu-item @click="logout">退出登录</el-menu-item>
<el-menu-item index="1-3" @click="openExportList">查看下载列表</el-menu-item>
</el-sub-menu>

306
src/views/permissions/permission.vue

@ -1,14 +1,15 @@
<script setup>
import {onMounted, ref} from 'vue'
import {ElMessage} from 'element-plus'
import {InfoFilled, UserFilled} from '@element-plus/icons-vue'
import { ref, onMounted, reactive, computed, watch } from 'vue'
import ElementPlus from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import axios from 'axios'
import moment from 'moment'
import { UserFilled } from '@element-plus/icons-vue'
import _ from 'lodash'
import request from '@/util/http'
import API from '@/util/http'
//
const tableData = ref([])
// ===========================================
//
const total = ref(100)
// admin
const admin = ref({
@ -22,28 +23,40 @@ const getObj = ref({
pageSize: 10
})
//
const permissionAddVisible = ref(false)
const userAddVisible = ref(false)
//
const permissionEditVisible = ref(false)
const userEditVisible = ref(false)
//
const market = ref([])
//
const postiton = ref([])
//
//
const userAddObj = ref({})
//
const permissionAddObj = ref({})
//
const permissionAddVisible = ref(false)
// addMachineIdInput
const addAdmin = ref({
account: '',
name: '',
market: '',
permission: [],
market: [],
permission: '',
postiton: '',
machineId: '', //
machineIds: [], //
remark: ''
})
const addMachineIdInput = function () { // >=1
// 01>=1
//
const addRole = ref({
roleName: '',
parentName: '',
checkedKeys: [],
grade: ''
})
//
const permissionSelect = ref()
const addMachineIdInput = function () {
if (addAdmin.value.machineIds.length >= 1) {
ElMessage.warning('设备数量已达上限')
return
@ -55,16 +68,22 @@ const addMachineIdInput = function () { // 为啥>=1????????
const permissionEditObj = ref({})
//
const delObj = ref({})
//
const lists = [
{ name: '管理员', value: '1', permissions: ['2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20'] },
{ name: '总部财务', value: '2', permissions: ['2', '3', '4', '5', '6', '7', '8', '9'] },
{ name: '总部客服', value: '3', permissions: ['2', '3', '4', '5', '6', '7', '8'] },
{ name: '地区负责人', value: '4', permissions: ['2', '3', '4', '5', '6'] },
{ name: '地区财务', value: '5', permissions: ['2', '3', '4', '5'] },
{ name: '客服专员', value: '6', permissions: ['2', '3'] }
]
//
const get = async function (val) {
try {
//
if (typeof val === 'number') {
getObj.value.pageNum = val
}
console.log('搜索参数', getObj.value, admin.value)
// POST
const result = await request({
url: '/permission/getPermission',
data: {
@ -81,13 +100,11 @@ const get = async function (val) {
console.log('请求失败', error)
}
}
//
const trimJwCode = () => {
if (admin.value.account) {
admin.value.account = admin.value.account.replace(/\s/g, '');
}
}
//
const search = function () {
trimJwCode();
getObj.value.pageNum = 1
@ -96,10 +113,8 @@ const search = function () {
//
const reset = function () {
admin.value = {}
// addAdmin.value = {}//Ref.value.resetFields()reset
}
//
const getArea = async function () {
try {
const result = await request({
@ -109,7 +124,6 @@ const getArea = async function () {
market.value = result.data
} catch (error) {
console.log('请求失败', error)
//
}
}
//
@ -122,19 +136,30 @@ const getStore = async function () {
postiton.value = result.data
} catch (error) {
console.log('请求失败', error)
//
}
}
//
const openUserAddVisible = function () {
userAddVisible.value = true
addAdmin.value = {
account: '',
name: '',
market: '',
permission: '',
postiton: '',
machineId: '',
machineIds: [],
remark: ''
};
}
//
const openPermissionAddVisible = function () {
permissionAddVisible.value = true
}
//
const closePermissionAddVisible = function () {
// reset() ...resetreset
//
const closeUserAddVisible = function () {
addAdmin.value = {
account: '',
name: '',
@ -145,12 +170,20 @@ const closePermissionAddVisible = function () {
machineIds: [],
remark: ''
};
permissionAddVisible.value = false;
userAddVisible.value = false;
//
Ref.value.resetFields();
}
const closePermissionAddVisible = function () {
permissionAddVisible.value = false
Ref.value.resetFields();
}
//
const userAddInit = function () {
userAddObj.value = {}
openUserAddVisible()
}
//
const permissionAddInit = function () {
permissionAddObj.value = {}
openPermissionAddVisible()
@ -158,6 +191,7 @@ const permissionAddInit = function () {
const permissionAdd = async function () {
Ref.value.validate(async (valid) => {
console.log('addRole', addRole.value)
console.log('valid', valid)
if (valid) {
try {
@ -190,16 +224,14 @@ const permissionAdd = async function () {
addAdmin.value = {}
get()
closePermissionAddVisible()
closeUserAddVisible()
} catch (error) {
console.log('新增用户权限失败', error)
//
ElMessage.error('新增用户权限失败')
closePermissionAddVisible()
closeUserAddVisible()
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
@ -242,12 +274,12 @@ const permissionList = [
]
//
const openPermissionEditVisible = function () {
permissionEditVisible.value = true
const openUserEditVisible = function () {
userEditVisible.value = true
}
//
const closePermissionEditVisible = function () {
permissionEditVisible.value = false
const closeUserEditVisible = function () {
userEditVisible.value = false
}
//
const permissionEditInit = function (row) {
@ -260,7 +292,7 @@ const permissionEditInit = function (row) {
permissionEditObj.value.permission = row.permission
permissionEditObj.value.roleId = row.roleId
console.log('编辑用户权限', permissionEditObj.value)
openPermissionEditVisible()
openUserEditVisible()
}
//
const permissionEdit = async function () {
@ -269,16 +301,14 @@ const permissionEdit = async function () {
url: '/permission/updateAdminRole',
data: permissionEditObj.value
})
//
console.log('请求成功3', result)
ElMessage.success('编辑用户权限成功')
get()
closePermissionEditVisible()
closeUserEditVisible()
} catch (error) {
console.log('编辑用户权限失败', error)
//
ElMessage.error('编辑用户权限失败')
closePermissionEditVisible()
closeUserEditVisible()
}
}
const throttledPermissionEdit = _.throttle(permissionEdit, 5000, {
@ -306,10 +336,25 @@ const delConfirm = async function () {
get()
} catch (error) {
console.log('删除权限失败', error)
//
ElMessage.error('删除权限失败')
}
}
const handleAddRole = async function () {
try {
const res = await API({
url: '/role/add',
data: {
"roleName": addRole.value.roleName,
"menuIds": addRole.value.checkedKeys,
"priority": addRole.value.grade,
"fatherId": addRole.value.parentName
}
})
console.log('成功了,看看addRole', addRole.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
const editStatus = async function (row) {
try {
@ -325,10 +370,7 @@ const editStatus = async function (row) {
url: '/permission/upadatePermission',
data: permissionEditObj.value
})
//
console.log('请求成功2', result)
ElMessage.success(
permissionEditObj.value.adminStatus == 1 ? '启用成功' : '禁用成功'
)
@ -397,9 +439,156 @@ const handleCurrentChange = function (val) {
getObj.value.pageNum = val
get()
}
const data = [
{
value: '2',
label: '工作台'
},
{
value: '3',
label: '财务审核',
children: [
{
value: '11',
label: '充值审核'
},
{
value: '13',
label: '退款审核'
}, {
value: '12',//14
label: '审核操作'
}
]
},
{
value: '4',
label: '汇率管理'
}, {
value: '5',
label: '充值管理',
children: [
{
value: '17',
label: '新增充值'
},
{
value: '18',
label: '金币充值明细'
}
]
}, {
value: '6',
label: '消耗管理',
children: [
{
value: '19',
label: '新增消耗'
},
{
value: '20',
label: '金币消耗明细'
}
]
}, {
value: '7',
label: '退款管理',
children: [
{
value: '21',
label: '新增退款'
},
{
value: '22',
label: '金币退款明细'
}
]
}, {
value: '8',
label: '客户账户明细',
children: [
{
value: '23',
label: '客户金币明细'
},
{
value: '24',
label: '客户金币余额'
}
]
}, {
value: '9',
label: '权限管理'
}, {
value: '100',
label: '地区数据',
children: [
{
value: '101',
label: '总部'
},
{
value: '102',
label: '香港'
},
{
value: '103',
label: '新加坡'
},
{
value: '104',
label: '马来西亚'
},
{
value: '105',
label: '越南'
},
{
value: '106',
label: '韩国'
}
]
}
]
const filteredData = ref([...data])
watch(() => addRole.value.parentName, (newValue) => {
if (newValue) {
const selectedRole = lists.find(role => role.value === newValue)
if (selectedRole) {
const allowedPermissions = selectedRole.permissions
filteredData.value = filterPermissions(data, allowedPermissions)
} else {
filteredData.value = data
}
} else {
filteredData.value = data
}
})
const filterPermissions = (permissions, allowedPermissions) => {
return permissions.filter(permission => {
if (allowedPermissions.includes(permission.value)) {
if (permission.children) {
permission.children = filterPermissions(permission.children, allowedPermissions)
}
return true
}
return false
})
}
const includeHq = computed(() => {
const i = addAdmin.value.market.includes('总部')
return (item) => i && item != '总部'
})
const handleCheckChange = (checkedNodes, { checkedKeys }) => {
addRole.value.checkedKeys = checkedKeys;
};
</script>
<template>
<!-- 搜索表单 -->
<el-row>
<el-col>
<el-card style="margin-bottom: 20px">
@ -435,7 +624,8 @@ const handleCurrentChange = function (val) {
<el-card>
<!-- 展示表单 -->
<div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()">新增用户</el-button>
<el-button style="color: #048efb; border: 1px solid #048efb" @click="userAddInit()">新增用户</el-button>
<el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()">新增角色</el-button>
</div>
<div>
@ -508,7 +698,7 @@ const handleCurrentChange = function (val) {
</el-col>
</el-row>
<!-- 新增用户权限 -->
<el-dialog v-model="permissionAddVisible" title="新增用户权限" width="800px" :close-on-click-modal="false">
<el-dialog v-model="userAddVisible" title="新增用户权限" width="800px" :close-on-click-modal="false">
<template #footer>
<!-- 居中显示 -->
@ -556,7 +746,7 @@ const handleCurrentChange = function (val) {
</el-form>
<div>
<el-button @click="closePermissionAddVisible()">取消</el-button>
<el-button @click="closeUserAddVisible()">取消</el-button>
<el-button type="primary" @click="throttledPermissionAdd()">
提交
</el-button>
@ -619,19 +809,10 @@ const handleCurrentChange = function (val) {
</el-icon>
</el-divider>
<div>
<span class="permissionVisible" style="margin-right: 20px">权限设置:</span>
<el-radio-group v-model="permissionEditObj.roleId">
<el-radio value="1" border>管理员</el-radio>
<el-radio value="2" border>总部财务</el-radio>
<el-radio value="3" border>总部客服</el-radio>
<el-radio value="4" border>地区负责人</el-radio>
<el-radio value="5" border>地区财务</el-radio>
<el-radio value="6" border>客服专员</el-radio>
</el-radio-group>
</div>
<template #footer>
<div>
<el-button @click="closePermissionEditVisible()">取消</el-button>
<el-button @click="closeUserEditVisible()">取消</el-button>
<el-button type="primary" @click="throttledPermissionEdit">
提交
</el-button>
@ -668,11 +849,6 @@ const handleCurrentChange = function (val) {
<style scoped>
.permissionVisible {
font-size: 16px;
font-weight: bold;
}
.pagination {
display: flex;
}
@ -692,7 +868,7 @@ const handleCurrentChange = function (val) {
.head-card-btn {
margin-left: auto;
}
/* ceshi */
/* 新增样式让弹窗内容居中 */
.el-dialog__body {
display: flex;
@ -705,4 +881,4 @@ const handleCurrentChange = function (val) {
flex-direction: column;
align-items: center;
}
</style>
</style>

161
src/views/recharge/coinRechargeDetail.vue

@ -327,31 +327,7 @@ const get7Days = function () {
get()
}
const exportExcel = async function () {
const params = {
rechargeUser: {
jwcode: rechargeUser.value.jwcode || '',
market: rechargeUser.value.market || '',
payPlatform: rechargeUser.value.payPlatform || '',
activity: rechargeUser.value.activity || '',
startTime: rechargeUser.value.startTime || '',
endTime: rechargeUser.value.endTime || ''
},
page: getObj.value.pageNum,
size: getObj.value.pageSize
}
try {
const res = await API({ url: '/export/exportRecharge', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
} else {
ElMessage.error(res.message || '导出失败,请稍后重试')
}
} catch (error) {
console.log('请求失败', error)
ElMessage.error('导出失败,请稍后重试')
}
}
//
onMounted(async function () {
@ -384,6 +360,106 @@ const handleSortChange = (column) => {
console.log('传递给后端的排序方式:', sortOrder.value)
get()
}
const exportExcel = async function () {
const params = {
rechargeUser: {
jwcode: rechargeUser.value.jwcode || '',
market: rechargeUser.value.market || '',
payPlatform: rechargeUser.value.payPlatform || '',
activity: rechargeUser.value.activity || '',
startTime: rechargeUser.value.startTime || '',
endTime: rechargeUser.value.endTime || ''
},
page: getObj.value.pageNum,
size: total.value
}
try {
const res = await API({ url: '/export/exportRecharge', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
} else {
ElMessage.error(res.message || '导出失败,请稍后重试')
}
} catch (error) {
console.log('请求失败', error)
ElMessage.error('导出失败,请稍后重试')
}
}
const exportListVisible = ref(false)
//
const openExportList = () => {
getExportList()
exportListVisible.value = true
}
//
const exportList = ref([])
//
const exportListLoading = ref(false)
//
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 2; //2
});
exportList.value = filteredData
} else {
ElMessage.error(result.msg || '获取导出列表失败')
}
} catch (error) {
console.error('获取导出列表出错:', error)
ElMessage.error('获取导出列表失败,请稍后重试')
} finally {
exportListLoading.value = false
}
}
//
const downloadExportFile = (item) => {
if (item.state === 2) {
const link = document.createElement('a')
link.href = item.url
link.download = item.fileName
link.click()
} else {
ElMessage.warning('文件还在导出中,请稍后再试')
}
}
//
const getTagType = (state) => {
switch (state) {
case 0:
return 'info';
case 1:
return 'primary';
case 2:
return'success';
case 3:
return 'danger';
default:
return 'info';
}
}
//
const getTagText = (state) => {
switch (state) {
case 0:
return '待执行';
case 1:
return '执行中';
case 2:
return'执行完成';
case 3:
return '执行出错';
default:
return '未知状态';
}
}
</script>
<template>
@ -424,7 +500,7 @@ const handleSortChange = (column) => {
</el-row>
<el-row>
<el-col :span="21">
<el-col :span="24">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
@ -435,6 +511,7 @@ const handleSortChange = (column) => {
<el-button type="success" @click="reset()">重置</el-button>
<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>
</div>
</el-col>
</el-row>
@ -488,6 +565,38 @@ const handleSortChange = (column) => {
</el-card>
</el-col>
</el-row>
<!-- 导出弹窗 -->
<el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100%" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<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="创建时间">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button text @click="exportListVisible = false">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>
.pagination {

165
src/views/refund/coinRefundDetail.vue

@ -331,33 +331,7 @@ const getGoods = async function () {
//
}
}
const exportExcel = async function () {
const params = {
refundUser: {
jwcode: refundUser.value.jwcode || '',
refundModel : refundUser.value.refundModel || '',
market: refundUser.value.market || '',
startTime: refundUser.value.startTime || '',
endTime: refundUser.value.endTime || '',
goodsName: refundUser.value.goodsName || '',
},
page:getObj.pageNum,
size:getObj.pageSize
}
try{
const res = await API({ url: '/export/exportRefund', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
} else {
ElMessage.error(res.message || '导出失败,请稍后重试')
}
} catch (error) {
console.log('请求失败', error)
ElMessage.error('导出失败,请稍后重试')
}
}
//
onMounted(async function () {
await getAdminData()
@ -397,6 +371,107 @@ const handleCurrentChange = function (val) {
getObj.value.pageNum = val
getSelectBy()
}
const exportExcel = async function () {
const params = {
refundUser: {
jwcode: refundUser.value.jwcode || '',
refundModel : refundUser.value.refundModel || '',
market: refundUser.value.market || '',
startTime: refundUser.value.startTime || '',
endTime: refundUser.value.endTime || '',
goodsName: refundUser.value.goodsName || '',
},
page:getObj.pageNum,
size:total.value
}
try{
const res = await API({ url: '/export/exportRefund', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
} else {
ElMessage.error(res.message || '导出失败,请稍后重试')
}
} catch (error) {
console.log('请求失败', error)
ElMessage.error('导出失败,请稍后重试')
}
}
const exportListVisible = ref(false)
//
const openExportList = () => {
getExportList()
exportListVisible.value = true
}
//
const exportList = ref([])
//
const exportListLoading = ref(false)
//
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 3; //3退
});
exportList.value = filteredData
} else {
ElMessage.error(result.msg || '获取导出列表失败')
}
} catch (error) {
console.error('获取导出列表出错:', error)
ElMessage.error('获取导出列表失败,请稍后重试')
} finally {
exportListLoading.value = false
}
}
//
const downloadExportFile = (item) => {
if (item.state === 2) {
const link = document.createElement('a')
link.href = item.url
link.download = item.fileName
link.click()
} else {
ElMessage.warning('文件还在导出中,请稍后再试')
}
}
//
const getTagType = (state) => {
switch (state) {
case 0:
return 'info';
case 1:
return 'primary';
case 2:
return'success';
case 3:
return 'danger';
default:
return 'info';
}
}
//
const getTagText = (state) => {
switch (state) {
case 0:
return '待执行';
case 1:
return '执行中';
case 2:
return'执行完成';
case 3:
return '执行出错';
default:
return '未知状态';
}
}
</script>
<template>
@ -407,11 +482,9 @@ const handleCurrentChange = function (val) {
<el-col :span="5">
<div class="head-card-element">
<el-text class="mx-1" >精网号</el-text>
<el-input
v-model="refundUser.jwcode"
placeholder="请输入精网号"
style="width: 150px"
clearable
/>
@ -479,7 +552,7 @@ const handleCurrentChange = function (val) {
</el-col>
</el-row>
<el-row>
<el-col :span="21">
<el-col :span="24">
<div class="head-card-element">
<el-text class="mx-1" >退款时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间" end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
@ -490,6 +563,7 @@ const handleCurrentChange = function (val) {
<el-button type="success" @click="reset()">重置</el-button>
<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>
</div>
</el-col>
</el-row>
@ -619,6 +693,39 @@ const handleCurrentChange = function (val) {
</el-card>
</el-col>
</el-row>
<!-- 导出弹窗 -->
<el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100%" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<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="创建时间">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button text @click="exportListVisible = false">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>

168
src/views/usergold/clientCountBalance.vue

@ -2,10 +2,10 @@
//
import {ref, onMounted, reactive, computed, watch} from 'vue'
import ElementPlus from 'element-plus'
import {ElMessage, ElMessageBox} from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import axios from 'axios'
import moment from 'moment'
import {ta} from 'element-plus/es/locales.mjs'
import { ta } from 'element-plus/es/locales.mjs'
import API from '@/util/http'
//
@ -14,7 +14,7 @@ const adminData = ref({})
const dialogVisible = ref(false)
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
// console.log('', result)
console.log('管理员用户信息', adminData.value)
@ -35,7 +35,7 @@ const getmarket = async () => {
console.log('获取地区数据成功', result)
// { value, label }
if (Array.isArray(result.data) && typeof result.data[0] === 'string') {
market.value = result.data.map(item => ({value: item, label: item}));
market.value = result.data.map(item => ({ value: item, label: item }));
} else {
market.value = result.data;
}
@ -104,7 +104,7 @@ const get = async function (val) {
// POST
const requestData = {...getObj.value, user: {...user.value}};//
const requestData = { ...getObj.value, user: { ...user.value } };//
console.log('最终请求参数', JSON.stringify(requestData, null, 2)); //
//console.log('', requestData);
@ -112,7 +112,7 @@ const get = async function (val) {
const result = await API({
url: '/goldDetail/getGold',
method: 'post',
data: {...getObj.value, user: {...user.value}}
data: { ...getObj.value, user: { ...user.value } }
})
console.log('响应数据', result)
tableData.value = result.data.list
@ -240,6 +240,7 @@ onMounted(async function () {
await getAdminData()
await get()
await getmarket()
await getExportList()
})
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
@ -256,11 +257,103 @@ const exportExcel = async function () {
markets: user.value.markets ||[]
}
}
const res = await API({url: '/goldDetail/exportGold', data: params})
const res = await API({ url: '/goldDetail/exportGold', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
}
}
const exportListVisible = ref(false)
//
const openExportList = () => {
getExportList()
exportListVisible.value = true
}
//
const exportList = ref([])
//
const exportListLoading = ref(false)
//
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 1; //type0
});
exportList.value = filteredData
} else {
ElMessage.error(result.msg || '获取导出列表失败')
}
} catch (error) {
console.error('获取导出列表出错:', error)
ElMessage.error('获取导出列表失败,请稍后重试')
} finally {
exportListLoading.value = false
}
}
//
const downloadExportFile = (item) => {
if (item.state === 2) {
const link = document.createElement('a')
link.href = item.url
link.download = item.fileName
link.click()
} else {
ElMessage.warning('文件还在导出中,请稍后再试')
}
}
//
const getTagType = (state) => {
switch (state) {
case 0:
return 'info';
case 1:
return 'primary';
case 2:
return 'success';
case 3:
return 'danger';
default:
return 'info';
}
}
//
const getTagText = (state) => {
switch (state) {
case 0:
return '待执行';
case 1:
return '执行中';
case 2:
return '执行完成';
case 3:
return '执行出错';
default:
return '未知状态';
}
}
const handleMarketChange = (val) => {
if (!Array.isArray(val)) return
const hasHeadquarters = val.includes('总部')
const hasOther = val.some(item => item !== '总部')
if (hasHeadquarters && hasOther) {
if (val[val.length - 1] === '总部') {
//
goldDetail.value.markets = ['总部']
ElMessage.warning('“总部”与其他地区不可同时选择,系统已为您保留“总部”')
} else {
//
goldDetail.value.markets = val.filter(item => item !== '总部')
ElMessage.warning('“总部”与其他地区不可同时选择,系统已为您去除“总部”')
}
}
}
</script>
<template>
@ -270,7 +363,7 @@ const exportExcel = async function () {
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input v-model="user.jwcode" style="width: 160px" placeholder="请输入精网号" clearable/>
<el-input v-model="user.jwcode" style="width: 160px" placeholder="请输入精网号" clearable />
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
@ -282,6 +375,7 @@ const exportExcel = async function () {
<el-button @click="reset" type="success">重置</el-button>
<el-button type="primary" @click="exportExcel()">导出Excel</el-button>
<el-button type="primary" @click="openExportList">查看导出列表</el-button>
</div>
<!-- </div> -->
</el-card>
@ -299,25 +393,25 @@ const exportExcel = async function () {
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 626px; overflow-y: auto">
<el-table :data="tableData" @cellClick="cellClick" style="width: 100%" height="626px"
@sort-change="handleSortChange">
@sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column prop="name" label="姓名" width="120"/>
<el-table-column prop="jwcode" label="精网号" width="120"/>
<el-table-column prop="market" label="所属地区" width="120"/>
<el-table-column prop="name" label="姓名" width="120" />
<el-table-column prop="jwcode" label="精网号" width="120" />
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column prop="allJb" label="金币总数" width="120" aligh="center">
<template #default="scope">
<span>{{
(scope.row.currentPermanentGold +
scope.row.currentFreeJune +
scope.row.currentFreeDecember +
scope.row.currentTaskGold) / 100
}}</span>
(scope.row.currentPermanentGold +
scope.row.currentFreeJune +
scope.row.currentFreeDecember +
scope.row.currentTaskGold) / 100
}}</span>
</template>
</el-table-column>
<el-table-column prop="currentPermanentGold" label="永久金币" sortable="custom" width="110">
@ -374,14 +468,44 @@ const exportExcel = async function () {
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100%" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<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="创建时间">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button text @click="exportListVisible = false">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped lang="scss">

177
src/views/usergold/clientCountDetail.vue

@ -226,13 +226,13 @@ const get = async function (val) {
url: '/goldDetail/getTotal',
method: 'post',
data: {
goldDetail:{...goldDetail.value},
/* jwcode: goldDetail.value.jwcode || '',
payPlatform: goldDetail.value.payPlatform || '',
type: goldDetail.value.type || '',
market: goldDetail.value.market || '',
startTime: goldDetail.value.startTime || '',
endTime: goldDetail.value.endTime || ''*/
goldDetail: { ...goldDetail.value },
/* jwcode: goldDetail.value.jwcode || '',
payPlatform: goldDetail.value.payPlatform || '',
type: goldDetail.value.type || '',
market: goldDetail.value.market || '',
startTime: goldDetail.value.startTime || '',
endTime: goldDetail.value.endTime || ''*/
}
})
@ -347,13 +347,31 @@ const handleSortChange = (column) => {
sortField.value = 'free_gold'
} else if (column.prop === 'auditTime') {//creatTime
sortField.value = 'audit_time'
}
}
sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
//gethandleSortChange
get()
}
const exportExcel = async function () {
const params = {
goldDetail: {
jwcode: goldDetail.value.jwcode || '',
payPlatform: goldDetail.value.payPlatform || '',
type: goldDetail.value.type || '',
markets: goldDetail.value.markets || [],
startTime: goldDetail.value.startTime || '',
endTime: goldDetail.value.endTime || '',
sortField: goldDetail.value.sortField || '',
sortOrder: goldDetail.value.sortOrder || ''
},
}
const res = await API({ url: '/goldDetail/export', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
}
}
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
@ -395,6 +413,98 @@ onMounted(async function () {
await getAdminData()
await getPlatform() //
})
const exportListVisible = ref(false)
//
const openExportList = () => {
getExportList()
exportListVisible.value = true
}
//
const exportList = ref([])
//
const exportListLoading = ref(false)
//
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 0; //0
});
exportList.value = filteredData
} else {
ElMessage.error(result.msg || '获取导出列表失败')
}
} catch (error) {
console.error('获取导出列表出错:', error)
ElMessage.error('获取导出列表失败,请稍后重试')
} finally {
exportListLoading.value = false
}
}
//
const downloadExportFile = (item) => {
if (item.state === 2) {
const link = document.createElement('a')
link.href = item.url
link.download = item.fileName
link.click()
} else {
ElMessage.warning('文件还在导出中,请稍后再试')
}
}
//
const getTagType = (state) => {
switch (state) {
case 0:
return 'info';
case 1:
return 'primary';
case 2:
return 'success';
case 3:
return 'danger';
default:
return 'info';
}
}
//
const getTagText = (state) => {
switch (state) {
case 0:
return '待执行';
case 1:
return '执行中';
case 2:
return '执行完成';
case 3:
return '执行出错';
default:
return '未知状态';
}
}
const handleMarketChange = (val) => {
if (!Array.isArray(val)) return
const hasHeadquarters = val.includes('总部')
const hasOther = val.some(item => item !== '总部')
if (hasHeadquarters && hasOther) {
if (val[val.length - 1] === '总部') {
//
goldDetail.value.markets = ['总部']
ElMessage.warning('“总部”与其他地区不可同时选择,系统已为您保留“总部”')
} else {
//
goldDetail.value.markets = val.filter(item => item !== '总部')
ElMessage.warning('“总部”与其他地区不可同时选择,系统已为您去除“总部”')
}
}
}
</script>
<template>
<div>
@ -445,14 +555,18 @@ onMounted(async function () {
<div class="head-card-element">
<el-text class="mx-1" size="large">更新时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
<el-button @click="getToday()" style="margin-left: 10px" :type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
<el-button @click="getYesterday()" style="margin-left: 10px" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
<el-button @click="get7Days()" style="margin-left: 10px" :type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" />
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<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>
</div>
</el-card>
</el-col>
@ -464,7 +578,7 @@ onMounted(async function () {
金币总数{{ (totalGoldTotal) / 100 }}
永久金币{{ (totalPermanentGold) / 100 }}
免费金币{{ (totalFreeGold) / 100 }}
任务金币{{(totalTaskGold) / 100 }}
任务金币{{ (totalTaskGold) / 100 }}
</div>
<div style="height: 584px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange" height="584px">
@ -472,7 +586,7 @@ onMounted(async function () {
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
}}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150" />
@ -525,7 +639,7 @@ onMounted(async function () {
<template #default="scope">
<span>{{
moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss')
}}</span>
}}</span>
</template>
</el-table-column>
</el-table>
@ -541,6 +655,37 @@ onMounted(async function () {
</el-col>
</el-row>
<!-- 导出列表弹窗 -->
<el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100%" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<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="创建时间">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button text @click="exportListVisible = false">关闭</el-button>
</div>
</template>
</el-dialog>
</div>
</template>

85
src/views/workspace/index.vue

@ -162,17 +162,8 @@
<el-button @click="getMonth()" label="month" :type="activeTimeRange === 'month' ? 'primary' : ''">本月</el-button>
<el-button @click="getYear()" label="year" :type="activeTimeRange === 'year' ? 'primary' : ''">本年</el-button>
</div>
<!-- 设置日期选择器的显示和绑定值格式 -->
<el-date-picker
v-model="dateRange"
type="datetimerange"
range-separator="→"
start-placeholder="开始时间"
end-placeholder="结束时间"
style="margin-left:10px"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" style="margin-left:10px" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" />
<el-button type="primary" style="margin-left: 5px" @click="getChartData">查询</el-button>
</el-row>
</el-col>
@ -181,6 +172,11 @@
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="18">
<div class="bar">
<div v-if="chartLoading" class="loading-overlay">
<div class="loading-spinner"></div>
</div>
<div ref="chartRef" style="width: 100%; height: 400px"></div>
</div>
</el-col>
@ -374,29 +370,29 @@ const processData = (data) => {
const yesterdayRefund = summary.refundPermanent + summary.refundFreeJune + summary.refundFreeDecember + summary.refundTask
//
currentGold.value = summary.currentGold
dailyChange.value = summary.dailyChange
currentPermanent.value = summary.currentPermanent
currentFree.value = summary.currentFree
currentFreeJune.value = summary.currentFreeJune
currentFreeDecember.value = summary.currentFreeDecember
currentTask.value = summary.currentTask
yearlyRecharge.value = summary.yearlyRecharge
yearlyMoney.value = summary.yearlyMoney
recharge.value = summary.recharge
money.value = summary.money
yearlyReduce.value = summary.yearlyReduce
yearlyConsume.value = summary.yearlyConsume
yearlyRefund.value = summary.yearlyRefund
dailyReduce.value = summary.dailyReduce
dailyConsume.value = yesterdayConsume
dailyRefund.value = yesterdayRefund
currentGold.value = summary.currentGold.toFixed(2)
dailyChange.value = summary.dailyChange.toFixed(2)
currentPermanent.value = summary.currentPermanent.toFixed(2)
currentFree.value = summary.currentFree.toFixed(2)
currentFreeJune.value = summary.currentFreeJune.toFixed(2)
currentFreeDecember.value = summary.currentFreeDecember.toFixed(2)
currentTask.value = summary.currentTask.toFixed(2)
yearlyRecharge.value = summary.yearlyRecharge.toFixed(2)
yearlyMoney.value = summary.yearlyMoney.toFixed(2)
recharge.value = summary.recharge.toFixed(2)
money.value = summary.money.toFixed(2)
yearlyReduce.value = summary.yearlyReduce.toFixed(2)
yearlyConsume.value = summary.yearlyConsume.toFixed(2)
yearlyRefund.value = summary.yearlyRefund.toFixed(2)
dailyReduce.value = summary.dailyReduce.toFixed(2)
dailyConsume.value = yesterdayConsume.toFixed(2)
dailyRefund.value = yesterdayRefund.toFixed(2)
yearlyRechargeNum.value = summary.yearlyRechargeNum
sumWow.value = summary.sumWow / length.value
sumDaily.value = summary.sumDaily / length.value
sumWow.value = (summary.sumWow / length.value).toFixed(2)
sumDaily.value = (summary.sumDaily / length.value).toFixed(2)
rechargeNum.value = summary.rechargeNum
firstRecharge.value = summary.firstRecharge
}
@ -459,7 +455,6 @@ const getChartData = async () => {
}
//
const processChartData = (marketCards) => {
//
const chartData = {
rechargePermanent: [],
rechargeFree: [],
@ -476,7 +471,6 @@ const processChartData = (marketCards) => {
const sumConsumeFree1 = ref(0)
const sumConsumeTask1 = ref(0)
//
marketCards.forEach(market => {
chartData.rechargePermanent.push(market.sumRechargePermanent / 100 || 0)
chartData.rechargeFree.push(market.sumRechargeFree / 100 || 0)
@ -500,12 +494,11 @@ const processChartData = (marketCards) => {
sumConsumeFree.value = sumConsumeFree1.value
sumConsumeTask.value = sumConsumeTask1.value
//
updateChart(chartData)
}
const processRankingData = (marketCards) => {
//
//
const rankingData = marketCards.map(market => {
let coinAmount = 0;
if (activeTab.value === 'recharge') {
@ -542,7 +535,7 @@ const processRankingData = (marketCards) => {
}
}
return {
market: market.market, // 使 market
market: market.market,
coinAmount: coinAmount
};
});
@ -550,23 +543,23 @@ const processRankingData = (marketCards) => {
//
rankingData.sort((a, b) => b.coinAmount - a.coinAmount);
//
//
tableData.value = rankingData.map((item, index) => ({
rank: index + 1,
...item
}));
}
// selectedType
watch(selectedType, () => {
getChartData();
});
//
const updateChart = (chartData) => {
if (!chartInstance) {
chartInstance = echarts.init(chartRef.value)
initChart()
}
chartLoading.value = true
try{
let series = []
let legend = []
@ -628,7 +621,6 @@ const updateChart = (chartData) => {
legend = ['永久金币', '免费金币', '任务金币']
}
//
const option = {
tooltip: {
trigger: 'axis',
@ -673,6 +665,14 @@ const updateChart = (chartData) => {
}
chartInstance.setOption(option)
} catch (error) {
console.error('图表更新失败:', error)
ElMessage.error('图表渲染失败')
} finally {
setTimeout(() => {
chartLoading.value = false
}, 300)
}
}
//
@ -714,7 +714,6 @@ const getCardData = async () => {
onMounted(async () => {
await getAdminData()
await getCardData()
await getMarkets()

Loading…
Cancel
Save