Browse Source

feat: 将地区选择改为级联下拉框

feat:添加地区映射
zhangrenyuan/feature-20250728113353-金币前端三期
lihui 3 weeks ago
parent
commit
083b74675c
  1. 32
      src/utils/marketMap.js
  2. 34
      src/utils/menuUtils.js
  3. 35
      src/views/audit/audit.vue
  4. 108
      src/views/audit/rechargeAudit.vue
  5. 173
      src/views/audit/refundAudit.vue
  6. 194
      src/views/consume/coinConsumeDetail.vue
  7. 4
      src/views/login.vue
  8. 29
      src/views/recharge/coinRechargeDetail.vue
  9. 365
      src/views/refund/coinRefundDetail.vue
  10. 166
      src/views/usergold/clientCountBalance.vue
  11. 7
      src/views/usergold/clientCountDetail.vue
  12. 115
      src/views/workspace/index.vue

32
src/utils/marketMap.js

@ -0,0 +1,32 @@
// 地区映射表
export const marketMapping = {
1: "Capt",
2: "公司",
3: "市场部",
4: "新加坡",
5: "马来西亚",
6: "Marymount",
7: "City Hall",
8: "Jurong",
9: "研发部",
10: "Tampines",
11: "吉隆坡",
13: "香港",
14: "湾仔",
24016: "加拿大",
24018: "泰国",
24019: "Asoke",
24020: "槟城",
24021: "新山",
24022: "越南HCM",
24027: "韩国",
24028: "深圳运营",
24029: "深圳",
24030: "未知",
null:"---"
};
// 反向映射
export const reverseMarketMapping = Object.entries(marketMapping).reduce((acc, [key, value]) => {
acc[value] = key;
return acc;
}, {});

34
src/utils/menuUtils.js

@ -71,38 +71,4 @@ export const getRoutePath = (menu) => {
// 未匹配的菜单默认使用id作为路由(可根据实际需求调整)
return routeMap[menu.menuName] || '/noPermission'
}
// 路由映射(获取第一个菜单)
export const getFirstRoutePath = (menu) => {
// 路由映射表:key为接口menuName,value为对应路由路径
const routeMap = {
'工作台展示': '/workspace',
'金币审核': '/audit',
'金豆审核': '/beanAudit',
'汇率管理': '/rate',
'金币充值': '/coinRecharge',
'金豆充值': '/beanRecharge',
'金币消耗': '/coinConsume',
'金豆消耗': '/beanConsume',
'金币退款': '/coinRefund',
// '金豆退款': '/beanRefund',
'权限管理': '/permissions',
'金币客户账户明细': '/usergold',
'金豆客户账户明细': '/userbean',
};
// 未匹配的菜单默认使用id作为路由(可根据实际需求调整)
return routeMap[menu.menuName] || '/noPermission'
}

35
src/views/audit/audit.vue

@ -4,12 +4,14 @@
<el-button
:type="activeTab === 'rechargeAudit' ? 'primary' : 'default'"
@click="navigateTo('rechargeAudit')"
:disabled="!hasRecharge"
>
充值审核
</el-button>
<el-button
:type="activeTab === 'refundAudit' ? 'primary' : 'default'"
@click="navigateTo('refundAudit')"
:disabled="!hasRefund"
>
退款审核
</el-button>
@ -23,6 +25,7 @@ import {ref, watch, onMounted} from 'vue';
import {useRouter, useRoute} from 'vue-router';
import {storeToRefs} from 'pinia';
import {useAdminStore} from '@/store/index.js';
import {permissionMapping} from "@/utils/menuTreePermission.js";
const router = useRouter();
const route = useRoute();
@ -30,29 +33,40 @@ const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
const activeTab = ref('');
const hasRecharge = ref(false);
const hasRefund = ref(false);
//
const navigateTo = (name) => {
activeTab.value = name;
router.push({name});
};
// menuName
const hasMenuPermission = (tree, targetName) => {
// menuId
const hasMenuPermission = (tree, targetId) => {
for (const node of tree) {
if (node.menuName === targetName) return true;
if (node.children && hasMenuPermission(node.children, targetName)) return true;
console.log(node.id)
if (node.id === targetId) return true;
if (node.children && hasMenuPermission(node.children, targetId)) return true;
}
return false;
};
//
// - 使 ID
const getDefaultAuditRoute = () => {
if (!menuTree.value) return 'rechargeAudit';
if (!menuTree.value || !menuTree.value.length) return 'rechargeAudit';
// 使 ID
hasRecharge.value = hasMenuPermission(menuTree.value, permissionMapping.Recharge_Audit);
hasRefund.value = hasMenuPermission(menuTree.value, permissionMapping.Refund_Audit);
const hasRecharge = hasMenuPermission(menuTree.value, '充值审核');
return hasRecharge ? 'rechargeAudit' : 'refundAudit';
// 退
if (hasRecharge) return 'rechargeAudit';
if (hasRefund) return 'refundAudit';
return 'rechargeAudit'; // 退
};
//
watch(() => route.name, (newName) => {
if (newName === 'rechargeAudit' || newName === 'refundAudit') {
@ -64,7 +78,6 @@ watch(() => route.name, (newName) => {
}
});
//
onMounted(() => {
if (route.name === 'audit') {
@ -77,4 +90,4 @@ onMounted(() => {
}
}
});
</script>
</script>

108
src/views/audit/rechargeAudit.vue

@ -21,12 +21,15 @@
</el-select>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text size="large">所属地区</el-text>
<el-select v-model="rechargeAudit.market" placeholder="请选择所属地区" style="width: 240px" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item"/>
</el-select>
</div>
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col>
</el-row>
<el-row>
@ -85,7 +88,11 @@
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px"/>
<el-table-column prop="market" label="所属地区" width="100px">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip/>
<el-table-column prop="money" label="充值金额" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
@ -176,13 +183,15 @@
</template>
<script setup>
import {computed, onMounted, reactive, ref} from 'vue'
import {onMounted, reactive, ref} from 'vue'
import {marketMapping, reverseMarketMapping} from '@/utils/marketMap.js'
import {ElMessage} from 'element-plus'
import request from '@/util/http'
import moment from 'moment'
import API from '@/util/http'
import moment from 'moment'
import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia";
import {findMenuById, permissionMapping} from "@/utils/menuTreePermission.js"
//
const trimJwCode = () => {
if (rechargeAudit.value.jwcode) {
@ -365,8 +374,10 @@ const resetSearch = function () {
startTime: "",
endTime: "",
market: "",
auditStatus: rechargeAudit.value.auditStatus
auditStatus: rechargeAudit.value.auditStatus,
}
selectedMarketPath.value = []
getTime.value = []
activeTimeRange.value = '' //
getRecharge()
@ -485,21 +496,6 @@ const getActivity = async function () {
}
}
//
const getMarket = async function () {
try {
const result = await request({
url: '/general/adminMarkets',
data: {
account: adminData.value.account
}
})
market.value = result.data
console.log('地区', market.value)
} catch (error) {
console.log('请求失败', error)
}
}
const handlePagination = (type, val) => {
if (type === 'size') {
@ -513,7 +509,6 @@ const handlePagination = (type, val) => {
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
import {permissionMapping, findMenuById} from "@/utils/menuTreePermission.js"
//
@ -534,7 +529,7 @@ const handleApprove = async (row) => {
console.error('审核通过失败', error)
ElMessage.error('操作失败')
}
}else {
} else {
ElMessage.error('无权限')
}
@ -624,6 +619,65 @@ const previewImage = (imageUrl) => {
});
};
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
rechargeAudit.value.market = reverseMarketMapping[selectedName] || '';
} else {
rechargeAudit.value.market = '';
}
};
//
const getMarket = async function () {
console.log('获取地区adminid', adminData.value)
try {
// POST
const result = await API({
url: '/market/selectMarket',
data: {account: adminData.value.account}
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return {
value: node.name, //使
label: node.name, //
children
};
});
}
//
market.value = transformTree(result.data)
console.log('转换后的地区树', market.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
onMounted(async function () {
await getAdminData()

173
src/views/audit/refundAudit.vue

@ -6,26 +6,31 @@
<el-row style="margin-bottom: 5px">
<el-col :span="6">
<el-text size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 240px" clearable/>
</el-col>
<el-col :span="6">
<el-text size="large">商品名</el-text>
<el-select v-model="searchForm.goodsName" placeholder="请输入商品名" style="width: 240px" clearable>
<el-option v-for="item in refundGoodsOptions" :key="item" :label="item" :value="item"> </el-option>
<el-option v-for="item in refundGoodsOptions" :key="item" :label="item" :value="item"></el-option>
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">退款方式</el-text>
<el-select v-model="searchForm.refundModel" placeholder="请选择" style="width: 240px" clearable>
<el-option label="全部退款" value="0" />
<el-option label="部分退款" value="1" />
<el-option label="全部退款" value="0"/>
<el-option label="部分退款" value="1"/>
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">所属地区</el-text>
<el-select v-model="searchForm.market" placeholder="请选择" style="width: 240px" clearable>
<el-option v-for="item in marketOptions" :key="item" :label="item" :value="item" />
</el-select>
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col>
</el-row>
<el-row>
@ -33,11 +38,18 @@
<div class="time-controls">
<div class="time-group">
<el-text size="large" style="width: 80px">提交时间</el-text>
<el-date-picker v-model="dateRange" 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>
<el-date-picker v-model="dateRange" 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>
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</div>
@ -65,17 +77,21 @@
</div>
<el-table :data="tableData" height="540px" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="60" />
<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="refundType" label="退款类型" width="120" />
<el-table-column type="index" label="序号" width="60"/>
<el-table-column prop="name" label="姓名" width="120"/>
<el-table-column prop="jwcode" label="精网号" width="120"/>
<el-table-column prop="market" label="所属地区" width="120">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="refundType" label="退款类型" width="120"/>
<el-table-column prop="refundModel" label="退款方式" width="120">
<template #default="{ row }">
{{ row.refundModel === 0 ? '全部退款' : '部分退款' }}
</template>
</el-table-column>
<el-table-column prop="goodsName" label="退款商品" width="120" show-overflow-tooltip />
<el-table-column prop="goodsName" label="退款商品" width="120" show-overflow-tooltip/>
<el-table-column prop="sumGold" label="退款金额" width="120" sortable="custom">
<template #default="{ row }">
{{ row.sumGold / 100 }}
@ -96,10 +112,11 @@
{{ row.taskGold / 100 }}
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip /><!-- 当内容过长被隐藏时显示 tooltip -->
<el-table-column prop="adminName" label="提交人" width="120" />
<el-table-column v-if="checkTab === 'reject'" prop="rejectReason" label="驳回理由" width="150" show-overflow-tooltip />
<el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120" />
<el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip/><!-- 当内容过长被隐藏时显示 tooltip -->
<el-table-column prop="adminName" label="提交人" width="120"/>
<el-table-column v-if="checkTab === 'reject'" prop="rejectReason" label="驳回理由" width="150"
show-overflow-tooltip/>
<el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120"/>
<el-table-column prop="createTime" label="提交时间" width="180" sortable="custom">
<template #default="{ row }">
{{ moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
@ -121,7 +138,7 @@
</template>
</el-popconfirm>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text
@click="showRejectDialog(scope.row)">
@click="showRejectDialog(scope.row)">
驳回
</el-button>
</div>
@ -129,14 +146,16 @@
</el-table-column>
</el-table>
<el-pagination class="pagination" v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</el-card>
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-form>
<el-form-item label="驳回理由" required>
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200" show-word-limit/>
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
show-word-limit/>
</el-form-item>
</el-form>
<template #footer>
@ -149,10 +168,11 @@
</template>
<script setup>
import { onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import {onMounted, reactive, ref} from 'vue'
import {ElMessage} from 'element-plus'
import API from '@/util/http'
import moment from 'moment'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
//
const activeTimeRange = ref('')
@ -215,11 +235,11 @@ const sortField = ref('')
const sortOrder = ref('')
//
const rules = reactive({
reason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
reason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
})
const getAdminData = async function () {
try {
const result = await API({ url: '/admin/userinfo', data: {} })
const result = await API({url: '/admin/userinfo', data: {}})
adminInfo.value = result
console.log('请求成功', result)
console.log('用户信息', adminInfo.value)
@ -245,11 +265,11 @@ const handleSortChange = (column) => {
sortField.value = 'permanent_gold'
} else if (column.prop === 'freeGold') {
sortField.value = 'freeGold'
}else if (column.prop === 'taskGold') {
} else if (column.prop === 'taskGold') {
sortField.value = 'task_gold'
}else if (column.prop === 'createTime') {
} else if (column.prop === 'createTime') {
sortField.value = 'create_time'
}else if (column.prop === 'auditTime') {
} else if (column.prop === 'auditTime') {
sortField.value = 'audit_time'
} else {
sortField.value = ''
@ -266,20 +286,52 @@ const showRejectDialog = (row) => {
rejectDialogVisible.value = true
}
//
const getmarkets = async () => {
const market = ref([])
//
const getMarket = async function () {
console.log('获取地区adminid', adminInfo.value)
try {
const result = await API({ url: '/general/adminMarkets', data: {
account: adminInfo.value.account,
} })
marketOptions.value = result.data || []
// POST
const result = await API({
url: '/market/selectMarket',
data: {account: adminInfo.value.account}
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return {
value: node.name, //使
label: node.name, //
children
};
});
}
//
market.value = transformTree(result.data)
console.log('转换后的地区树', market.value)
} catch (error) {
console.error('获取地区列表失败', error)
console.log('请求失败', error)
}
}
//
const getRefundGoods = async () => {
try {
const res = await API({ url: '/general/goods' })
const res = await API({url: '/general/goods'})
refundGoodsOptions.value = res.data || []
} catch (error) {
console.error('获取商品列表失败', error)
@ -304,12 +356,12 @@ const get = async function (val) {
pageSize: pagination.value.pageSize,
refundAudit: {
...searchForm.value,
sortField:sortField.value,
sortOrder:sortOrder.value
sortField: sortField.value,
sortOrder: sortOrder.value
}
}
console.log('看看传给后端的参数:', params)
const res = await API({ url: '/audit/selectRefund', data: params })
const res = await API({url: '/audit/selectRefund', data: params})
tableData.value = res.list || []
pagination.value.total = res.total || 0
console.log('查全部的total', pagination.value.total, res.total)
@ -326,7 +378,7 @@ const handleApprove = async (row) => {
action: 1,// action1,2
rejectReason: ''
}
await API({ url: '/audit/audit', data: params })//
await API({url: '/audit/audit', data: params})//
ElMessage.success('审核通过成功')
get()
getStats()
@ -350,12 +402,12 @@ const handleReject = async () => {
action: 2,
rejectReason: rejectReason.value
}
await API({ url: '/audit/audit', data: params })
await API({url: '/audit/audit', data: params})
ElMessage.success('驳回成功')
rejectDialogVisible.value = false
get()
getStats()
console.log('aaaaaaaaaa这是驳回调用',params)
console.log('aaaaaaaaaa这是驳回调用', params)
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
@ -404,12 +456,13 @@ const resetSearch = function () {
market: '',
startTime: '',
endTime: '',
sortField:'',
sortOrder:'',
auditStatus:auditStatus
sortField: '',
sortOrder: '',
auditStatus: auditStatus
}
dateRange.value = []
activeTimeRange.value = '' //
selectedMarketPath.value = []
}
//
@ -512,10 +565,28 @@ const adminReject = async function () {
console.log('aaaaaaaaaaaaaaaaaa看看checkTab,这是点击已驳回调用', checkTab.value)
}
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
searchForm.value.market = reverseMarketMapping[selectedName] || '';
} else {
searchForm.value.market = '';
}
};
onMounted(async () => {
await getAdminData()
getRefundGoods()
getmarkets()
await getMarket()
await get()
await getStats()
console.log('aaaaaaaaaa这是挂载后调用')

194
src/views/consume/coinConsumeDetail.vue

@ -1,9 +1,10 @@
<script setup>
import { computed, onMounted, ref } from 'vue'
import { dayjs, ElMessage } from 'element-plus'
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'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
//
/*
@ -181,7 +182,7 @@ const ConsumeSelectBy = async function (val) {
//
// detail.value
const detailWithoutSort = { ...consumeUser.value }
const detailWithoutSort = {...consumeUser.value}
delete detailWithoutSort.sortField
delete detailWithoutSort.sortOrder
@ -277,6 +278,7 @@ const reset = function () {
sortOrder.value = ''
getTime.value = {}
activeTimeRange.value = '' //
selectedMarketPath.value = []
//
@ -287,14 +289,14 @@ const reset = function () {
const getToday = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
@ -307,14 +309,14 @@ const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
@ -326,14 +328,14 @@ const getYesterday = function () {
const get7Days = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
@ -361,28 +363,50 @@ const getGoods = async function () {
}
//
//
const getMarket = async function () {
console.log('获取地区adminid', adminData.value)
try {
//
const result = await request({
// url: '/general/market',
// POST
const result = await API({
url: '/general/adminMarkets', // todo
data: {account:adminData.value.account}
})
console.log('请求地区列表成功', result)
//
market.value = result.data
console.log('地区数据', market.value)
url: '/market/selectMarket',
data: {account: adminData.value.account}
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return {
value: node.name, //使
label: node.name, //
children
};
});
}
//
market.value = transformTree(result.data)
console.log('转换后的地区树', market.value)
} catch (error) {
console.log('请求地区列表失败', error)
ElMessage({
type: 'error',
message: '获取地区列表失败,请稍后重试'
})
console.log('请求失败', error)
}
}
//
const handleSortChange = (column) => {
console.log('排序字段:', column.prop)
@ -447,7 +471,7 @@ const exportExcel = async function () {
sortOrder: sortOrder.value || ''
}
}
const res = await API({ url: '/export/exportConsume', data: params })
const res = await API({url: '/export/exportConsume', data: params})
if (res.code === 200) {
ElMessage.success('导出成功')
}
@ -468,7 +492,7 @@ const exportListLoading = ref(false)
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
const result = await API({url: '/export/export'})
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 4; //4
@ -525,6 +549,24 @@ const getTagText = (state) => {
return '未知状态';
}
}
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
consumeUser.value.market = reverseMarketMapping[selectedName] || '';
} else {
consumeUser.value.market = '';
}
};
</script>
<template>
@ -535,33 +577,37 @@ const getTagText = (state) => {
<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 />
<el-input v-model="consumeUser.jwcode" placeholder="请输入精网号" style="width: 150px" clearable/>
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">商品名称</el-text>
<el-select v-model="consumeUser.goodsName" placeholder="请选择商品名称" size="large" style="width: 180px"
clearable>
<el-select v-model="consumeUser.goodsName" placeholder="请选择商品名称" style="width: 180px"
clearable>
<!-- 修改 v-for 绑定逻辑 -->
<el-option v-for="(item, index) in goods" :key="index" :label="item" :value="item" />
<el-option v-for="(item, index) in goods" :key="index" :label="item" :value="item"/>
</el-select>
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="consumeUser.market" placeholder="请选择所属地区" size="large" style="width: 180px" clearable>
<el-option v-for="(item, index) in market" :key="index" :label="item" :value="item" />
</el-select>
</div>
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">消耗平台</el-text>
<el-select v-model="consumeUser.payPlatform" placeholder="请选择消耗平台" size="large" style="width: 180px"
clearable>
<el-option v-for="item in consumePlatform" :key="item.value" :label="item.label" :value="item.value" />
<el-select v-model="consumeUser.payPlatform" placeholder="请选择消耗平台"
style="width: 180px"
clearable>
<el-option v-for="item in consumePlatform" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</div>
</el-col>
@ -571,13 +617,16 @@ const getTagText = (state) => {
<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" />
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<!-- </div>
</el-col>
<el-col :span="3">
@ -606,16 +655,20 @@ const getTagText = (state) => {
<el-table-column type="index" label="序号" width="80px" 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="150px" fixed="left" />
<el-table-column prop="name" label="姓名" width="150px" fixed="left"/>
<!-- 固定精网号列 -->
<el-table-column prop="jwcode" label="精网号" width="110px" fixed="left" />
<el-table-column prop="market" label="所属地区" width="110px" />
<el-table-column prop="goodsName" label="商品" width="160px" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="110px" fixed="left"/>
<el-table-column prop="market" label="所属地区" width="110px">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="goodsName" label="商品" width="160px" show-overflow-tooltip/>
<el-table-column prop="payPlatform" label="消耗平台" width="120px">
<template #default="scope">
<!-- 使用非严格相等比较 -->
@ -633,8 +686,8 @@ const getTagText = (state) => {
<template #default="scope">
{{
(scope.row.taskGold +
scope.row.freeGold +
scope.row.permanentGold) / 100
scope.row.freeGold +
scope.row.permanentGold) / 100
}}
</template>
</el-table-column>
@ -655,17 +708,18 @@ const getTagText = (state) => {
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="adminName" label="提交人" width="110px" />
<el-table-column prop="createTime" label="消耗时间" sortable="custom" width="180px" />
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip/>
<el-table-column prop="adminName" label="提交人" width="110px"/>
<el-table-column prop="createTime" label="消耗时间" sortable="custom" width="180px"/>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<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>
@ -674,7 +728,7 @@ const getTagText = (state) => {
<!-- 导出弹窗 -->
<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="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'">
@ -690,7 +744,7 @@ const getTagText = (state) => {
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>

4
src/views/login.vue

@ -6,7 +6,7 @@ import {useRouter} from 'vue-router'
import API from "@/util/http.js";
import {useAdminStore} from '@/store'
//
import {filterFirstMenu, findFirstThirdLevelMenu, getFirstRoutePath,} from "../utils/menuUtils.js"
import {filterFirstMenu, findFirstThirdLevelMenu, getRoutePath,} from "../utils/menuUtils.js"
const router = useRouter() //
//
@ -69,7 +69,7 @@ const login = async function () {
console.log('获取到的第一个可访问的菜单', firstMenu)
// 访 path
const redirectPath = firstMenu ? getFirstRoutePath(firstMenu) : '/noPermission'
const redirectPath = firstMenu ? getRoutePath(firstMenu) : '/noPermission'
//
router.push(redirectPath)

29
src/views/recharge/coinRechargeDetail.vue

@ -6,6 +6,7 @@ import {AiFillRead} from 'vue-icons-plus/ai'
import axios from 'axios'
import moment from 'moment'
import API from '@/util/http'
import {marketMapping, reverseMarketMapping} from '@/utils/marketMap.js';
//
const adminData = ref({})
const getAdminData = async function () {
@ -39,19 +40,19 @@ const rechargeUser = ref({
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if(value && value.length > 0){
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
if (lastValue.endsWith('_all')) {
//
rechargeUser.value.market = lastValue.replace('_all', '');
} else {
//
rechargeUser.value.market = lastValue;
}
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
rechargeUser.value.market = reverseMarketMapping[selectedName] || '';
} else {
rechargeUser.value.market = ''
rechargeUser.value.market = '';
}
}
};
//
const getObj = ref({
@ -507,6 +508,8 @@ const getTagText = (state) => {
return '未知状态';
}
}
</script>
<template>
@ -604,7 +607,11 @@ const getTagText = (state) => {
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px"/>
<el-table-column prop="market" label="所属地区" width="100px">
<template #default="scope">
<span>{{ marketMapping[scope.row.market] || scope.row.market}}</span>
</template>
</el-table-column>
<el-table-column prop="activity" label="活动名称" width="110px" show-overflow-tooltip/>
<el-table-column prop="rateName" label="货币名称" width="110px"/>
<el-table-column prop="money" sortable="custom" label="充值金额" width="110px"/>

365
src/views/refund/coinRefundDetail.vue

@ -1,13 +1,11 @@
<script setup>
// 退
import {ref, onMounted, reactive, computed} from 'vue'
import ElementPlus from 'element-plus'
import {AiFillRead} from 'vue-icons-plus/ai'
import {ElMessage, ElMessageBox} from 'element-plus'
import axios from 'axios'
import {computed, onMounted, ref} from 'vue'
import {ElMessage} from 'element-plus'
import moment from 'moment'
import API from '@/util/http'
import request from '@/util/http'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
//
const trimJwCode = () => {
@ -81,14 +79,15 @@ const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
const getRefundTypes = async function () {
try {
// 退
const result = await API({
const result = await API({
url: '/refund/refundType', //退
data: {} })
data: {}
})
console.log('退款类型请求成功', result)
//
if (Array.isArray(result.data)) {
// { value, label }
refundType.value = result.data.map(item => ({ value: item, label: item }));
refundType.value = result.data.map(item => ({value: item, label: item}));
} else {
console.error('退款类型数据格式错误', result)
ElMessage.error('退款类型数据格式错误,请联系管理员')
@ -130,30 +129,30 @@ const getSelectBy = async function (val) {
url: '/refund/selectBy',
data: {
...getObj.value,
refundUser: { ...refundUser.value }
refundUser: {...refundUser.value}
}
})
// refundUser.value
const detailWithoutSort = { ...refundUser.value }
const detailWithoutSort = {...refundUser.value}
delete detailWithoutSort.sortField
delete detailWithoutSort.sortOrder
const resultTotalGold = await API({
url: '/refund/statsGold',
data: {
...detailWithoutSort
...detailWithoutSort
}
})
//
console.log('resultTotalGold请求成功', resultTotalGold)
console.log('resultTotalGold请求成功', resultTotalGold)
// code 200 data
if (resultTotalGold.code === 200 && resultTotalGold.data) {
const data = resultTotalGold.data
console.log('获取到的金币数据:', data)
permanentGolds.value = (Number(data.permanentGolds) || 0)
freeGolds.value = (Number(data.freeGolds) || 0)
taskGolds.value = (Number(data.taskGolds) || 0)
permanentGolds.value = (Number(data.permanentGolds) || 0)
freeGolds.value = (Number(data.freeGolds) || 0)
taskGolds.value = (Number(data.taskGolds) || 0)
}
//
@ -189,21 +188,21 @@ const reset = function () {
sortOrder.value = ''
getTime.value = {}
activeTimeRange.value = '' //
selectedMarketPath.value = []
getSelectBy()
}
//
const getToday = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
@ -216,14 +215,14 @@ const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
@ -235,14 +234,14 @@ const getYesterday = function () {
const get7Days = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
@ -266,18 +265,43 @@ const handleClick = function (tab, event) {
}
}
//
//
const getMarket = async function () {
console.log('获取地区adminid', adminData.value)
try {
// POST
const result = await API({ url: '/general/adminMarkets', data: {
account:adminData.value.account,
} })
const result = await API({
url: '/market/selectMarket',
data: {account: adminData.value.account}
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return {
value: node.name, //使
label: node.name, //
children
};
});
}
//
market.value = result.data
console.log('地区', market.value)
market.value = transformTree(result.data)
console.log('转换后的地区', market.value)
} catch (error) {
console.log('请求失败', error)
}
@ -359,7 +383,7 @@ const handleSortChange = (column) => {
sortField.value = 'createTime'
} else if (column.prop === 'auditTime') {
sortField.value = 'auditTime'
} else if (column.prop === 'sumGold') {
} else if (column.prop === 'sumGold') {
sortField.value = 'sumGold'
}
sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
@ -374,23 +398,23 @@ const handleCurrentChange = function (val) {
getSelectBy()
}
const exportExcel = async function () {
const exportExcel = async function () {
const params = {
refundUser: {
jwcode: refundUser.value.jwcode || '',
refundModel : refundUser.value.refundModel || '',
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
},
page: getObj.pageNum,
size: total.value
}
try{
const res = await API({ url: '/export/exportRefund', data: params })
if (res.code === 200) {
try {
const res = await API({url: '/export/exportRefund', data: params})
if (res.code === 200) {
ElMessage.success('导出成功')
} else {
ElMessage.error(res.message || '导出失败,请稍后重试')
@ -399,7 +423,7 @@ const exportExcel = async function () {
console.log('请求失败', error)
ElMessage.error('导出失败,请稍后重试')
}
}
const exportListVisible = ref(false)
@ -417,7 +441,7 @@ const exportListLoading = ref(false)
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
const result = await API({url: '/export/export'})
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 3; //3退
@ -451,8 +475,8 @@ const getTagType = (state) => {
return 'info';
case 1:
return 'primary';
case 2:
return'success';
case 2:
return 'success';
case 3:
return 'danger';
default:
@ -466,14 +490,32 @@ const getTagText = (state) => {
return '待执行';
case 1:
return '执行中';
case 2:
return'执行完成';
case 2:
return '执行完成';
case 3:
return '执行出错';
default:
return '未知状态';
}
}
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
refundUser.value.market = reverseMarketMapping[selectedName] || '';
} else {
refundUser.value.market = '';
}
};
</script>
<template>
@ -483,26 +525,26 @@ const getTagText = (state) => {
<el-row style="margin-bottom: 10px">
<el-col :span="5">
<div class="head-card-element">
<el-text class="mx-1" >精网号</el-text>
<el-text class="mx-1">精网号</el-text>
<el-input
v-model="refundUser.jwcode"
placeholder="请输入精网号"
style="width: 150px"
clearable
v-model="refundUser.jwcode"
placeholder="请输入精网号"
style="width: 150px"
clearable
/>
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" >商品名称</el-text>
<el-text class="mx-1">商品名称</el-text>
<el-select
v-model="refundUser.goodsName"
placeholder="请选择商品名称"
style="width: 180px"
clearable
v-model="refundUser.goodsName"
placeholder="请选择商品名称"
style="width: 180px"
clearable
>
<el-option
v-for="item in goods"
@ -514,40 +556,32 @@ const getTagText = (state) => {
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" >所属地区</el-text>
<el-select
v-model="refundUser.market"
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
style="width: 180px"
clearable
>
<el-option
v-for="item in market"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</div>
style="width:180px"
@change="handleMarketChange"
/>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" >退款类型</el-text>
<el-text class="mx-1">退款类型</el-text>
<el-select
v-model="refundUser.refundType"
placeholder="请选择退款类型"
style="width: 180px"
clearable
v-model="refundUser.refundType"
placeholder="请选择退款类型"
style="width: 180px"
clearable
>
<!-- todo 这需要改-->
<!-- todo 这需要改-->
<el-option
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
@ -556,11 +590,18 @@ const getTagText = (state) => {
<el-row>
<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"/>
<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-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"/>
<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>
@ -604,10 +645,10 @@ const getTagText = (state) => {
</template>
</el-table-column>
<el-table-column
prop="name"
label="姓名"
fixed="left"
width="130px"
prop="name"
label="姓名"
fixed="left"
width="130px"
/>
<el-table-column
prop="jwcode"
@ -615,9 +656,13 @@ const getTagText = (state) => {
fixed="left"
width="110px"
/>
<el-table-column prop="market" label="所属地区" width="110px" />
<el-table-column prop="goodsName" label="商品名称" width="110px" show-overflow-tooltip />
<el-table-column prop="refundType" label="退款类型" width="100px" />
<el-table-column prop="market" label="所属地区" width="110px">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="goodsName" label="商品名称" width="110px" show-overflow-tooltip/>
<el-table-column prop="refundType" label="退款类型" width="100px"/>
<!-- <el-table-column label="金额总数" width="110px">
<template #default="scope">
@ -628,10 +673,10 @@ const getTagText = (state) => {
</el-table-column> -->
<el-table-column
prop="sumGold"
label="金额总数"
width="110px"
sortable="custom"
prop="sumGold"
label="金额总数"
width="110px"
sortable="custom"
/>
<el-table-column prop="refundModel" label="退款方式" width="110px">
@ -640,22 +685,22 @@ const getTagText = (state) => {
</template>
</el-table-column>
<el-table-column
prop="permanentGold"
label="永久金币"
width="110px"
sortable="custom"
prop="permanentGold"
label="永久金币"
width="110px"
sortable="custom"
/>
<el-table-column
prop="freeGold"
sortable="custom"
label="免费金币"
width="110px"
prop="freeGold"
sortable="custom"
label="免费金币"
width="110px"
/>
<el-table-column
prop="taskGold"
sortable="custom"
label="任务金币"
width="110px"
prop="taskGold"
sortable="custom"
label="任务金币"
width="110px"
/>
<!-- 修改prop为taskGold -->
<el-table-column
@ -664,13 +709,13 @@ const getTagText = (state) => {
width="160px"
show-overflow-tooltip
/>
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="adminName" label="提交人" width="100px"/>
<el-table-column
prop="createTime"
sortable="custom"
label="提交时间"
width="180px"
prop="createTime"
sortable="custom"
label="提交时间"
width="180px"
>
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
@ -698,36 +743,36 @@ const getTagText = (state) => {
<!-- 导出弹窗 -->
<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>
<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>

166
src/views/usergold/clientCountBalance.vue

@ -2,11 +2,12 @@
//
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'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
//
//
@ -14,7 +15,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)
@ -26,32 +27,47 @@ const getAdminData = async function () {
//
const isLoadingmarket = ref(false);
const market = ref([])
const getmarket = async () => {
isLoadingmarket.value = true;
//
const getMarket = async function () {
console.log('获取地区adminid', adminData.value)
try {
// POST
const result = await API({
url: '/general/adminMarkets',
url: '/market/selectMarket',
data: {account: adminData.value.account}
});
console.log('获取地区数据成功', result)
// { value, label }
if (Array.isArray(result.data) && typeof result.data[0] === 'string') {
market.value = result.data
.filter(item => item !== null && item !== undefined && item.trim() !== '') //
.map(item => ({ value: item, label: item }));
} else {
market.value = result.data;
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return {
value: node.name, //使
label: node.name, //
children
};
});
}
//
market.value = transformTree(result.data)
console.log('转换后的地区树', market.value)
} catch (error) {
console.error('获取地区数据失败:', error);
ElMessage.error('获取地区数据失败,请稍后重试');
//
market.value = [];
} finally {
isLoadingmarket.value = false;
console.log('请求失败', error)
}
};
}
//
const tableData = ref([])
@ -107,7 +123,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);
@ -115,7 +131,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
@ -193,6 +209,7 @@ const reset = function () {
sortField.value = ''
sortOrder.value = ''
get()
selectedMarketPath.value = []
}
const cellClick = function (row, column) {
console.log('cellClick', column.label)
@ -223,7 +240,7 @@ const handleSortChange = (column) => {
onMounted(async function () {
await getAdminData()
await get()
await getmarket()
await getMarket()
await getExportList()
})
const handlePageSizeChange = function (val) {
@ -236,12 +253,12 @@ const handleCurrentChange = function (val) {
}
const exportExcel = async function () {
const params = {
user:{
user: {
jwcode: user.value.jwcode || '',
markets: user.value.markets ||[]
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('导出成功')
}
@ -263,7 +280,7 @@ const exportListLoading = ref(false)
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
const result = await API({url: '/export/export'})
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 1; //type0
@ -320,24 +337,22 @@ const getTagText = (state) => {
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] === '总部') {
//
user.value.markets = ['总部']
ElMessage.warning('“总部”与其他地区不可同时选择,系统已为您保留“总部”')
} else {
//
user.value.markets = val.filter(item => item !== '总部')
ElMessage.warning('“总部”与其他地区不可同时选择,系统已为您去除“总部”')
}
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
rechargeUser.value.market = reverseMarketMapping[selectedName] || '';
} else {
rechargeUser.value.market = '';
}
}
};
</script>
<template>
@ -347,13 +362,18 @@ const handleMarketChange = (val) => {
<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>
<el-select v-model="user.markets" placeholder="请选择所属地区" style="width: 180px" clearable multiple @change="handleMarketChange">
<el-option v-for="item in market" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</div>
<el-button type="primary" @click="search()">查询</el-button>
<el-button @click="reset" type="success">重置</el-button>
@ -370,32 +390,36 @@ const handleMarketChange = (val) => {
<el-card>
<div>
金币总数{{ (goldtotal || 0) / 100 }}
永久金币{{(permanentGold || 0) / 100 }}
永久金币{{ (permanentGold || 0) / 100 }}
免费金币{{ (freeGold || 0) / 100 }}
任务金币{{ (taskGold || 0) / 100 }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<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">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</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="allJb" label="金币总数" width="120" aligh="center">
<template #default="scope">
<span>{{
((scope.row.currentPermanentGold || 0 ) +
(scope.row.currentFreeJune|| 0 ) +
(scope.row.currentFreeDecember|| 0 ) +
(scope.row.currentTaskGold || 0) ) /100
}}</span>
((scope.row.currentPermanentGold || 0) +
(scope.row.currentFreeJune || 0) +
(scope.row.currentFreeDecember || 0) +
(scope.row.currentTaskGold || 0)) / 100
}}</span>
</template>
</el-table-column>
<el-table-column prop="currentPermanentGold" label="永久金币" sortable="custom" width="110">
@ -415,7 +439,7 @@ const handleMarketChange = (val) => {
</el-table-column>
<el-table-column prop="currentTaskGold" label="任务金币" sortable="custom" width="130">
<template #default="scope">
<span>{{(scope.row.currentTaskGold || 0) / 100 }}</span>
<span>{{ (scope.row.currentTaskGold || 0) / 100 }}</span>
</template>
</el-table-column>
@ -425,7 +449,7 @@ const handleMarketChange = (val) => {
<template #default>
<div>
<div>永久金币{{ (scope.row.sumPermanentGold || 0) / 100 }}</div>
<div>免费金币{{( (scope.row.sumFreeJune || 0) + (scope.row.sumFreeDecember || 0)) / 100 }}</div>
<div>免费金币{{ ((scope.row.sumFreeJune || 0) + (scope.row.sumFreeDecember || 0)) / 100 }}</div>
<div>任务金币{{ (scope.row.sumTaskGold || 0) / 100 }}</div>
</div>
</template>
@ -447,7 +471,10 @@ const handleMarketChange = (val) => {
<template #default>
<div>
<div>永久金币{{ (scope.row.sumConsumeGold || 0) / 100 }}</div>
<div>免费金币{{ ((scope.row.sumConsumeJune || 0) + (scope.row.sumConsumeDecember || 0)) / 100 }}</div>
<div>免费金币{{
((scope.row.sumConsumeJune || 0) + (scope.row.sumConsumeDecember || 0)) / 100
}}
</div>
<div>任务金币{{ (scope.row.sumConsumeJune || 0) / 100 }}</div>
</div>
</template>
@ -470,8 +497,9 @@ const handleMarketChange = (val) => {
<!-- 分页 -->
<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>
@ -479,7 +507,7 @@ const handleMarketChange = (val) => {
<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="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'">
@ -495,7 +523,7 @@ const handleMarketChange = (val) => {
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>

7
src/views/usergold/clientCountDetail.vue

@ -7,6 +7,7 @@ import moment from 'moment'
import API from '@/util/http'
import {writeFile, utils} from 'xlsx'
import request from "@/util/request.js";
import {marketMapping} from "../../utils/marketMap.js";
//
const activeTimeRange = ref('')
@ -553,7 +554,11 @@ const handleMarketChange = (val) => {
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="120"/>
<el-table-column prop="market" label="所属地区" width="120"/>
<el-table-column prop="market" label="所属地区" width="120">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="payPlatform" label="平台信息" width="140">
</el-table-column>

115
src/views/workspace/index.vue

@ -6,7 +6,9 @@
</el-col>
<!-- 最后更新时间 -->
<el-col :span="18" style="display: flex; align-items: center; font-size: 18px">
最后更新时间{{ workDataUpdateTime && workDataUpdateTime !== '1970-01-01 08:00:00' ? workDataUpdateTime : '该地区暂无数据' }}
最后更新时间{{
workDataUpdateTime && workDataUpdateTime !== '1970-01-01 08:00:00' ? workDataUpdateTime : '该地区暂无数据'
}}
</el-col>
@ -21,21 +23,23 @@
<template #header>
<div class="card-header">
<div class="card-title">当前金币余量</div>
<div>{{ currentGold / 100 }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日 {{
dailyChange / 100 }}
<div>{{ currentGold / 100 }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日
{{
dailyChange / 100
}}
<template v-if="dailyChange > 0">
<el-icon style="color:red">
<ArrowUpBold />
<ArrowUpBold/>
</el-icon>
</template>
<template v-else-if="dailyChange < 0">
<el-icon style="color:forestgreen">
<ArrowDownBold />
<ArrowDownBold/>
</el-icon>
</template>
<template v-else>
<el-icon style="color:grey">
<SemiSelect />
<SemiSelect/>
</el-icon>
</template>
</div>
@ -46,7 +50,9 @@
<div class="margin-bottom">免费金币{{ currentFree / 100 }}</div>
<div class="margin-bottom">[六月到期|{{ currentFreeJune / 100 }}]&nbsp;&nbsp;&nbsp;&nbsp;[12月到期|{{
currentFreeDecember /
100 }}]</div>
100
}}]
</div>
<div>任务金币{{ currentTask / 100 }}</div>
</div>
</el-card>
@ -91,34 +97,34 @@
<el-col class="center-card">周同比:{{ sumWow }}%&nbsp;&nbsp;&nbsp;&nbsp;
<template v-if="sumWow > 0">
<el-icon style="color:red">
<ArrowUpBold />
<ArrowUpBold/>
</el-icon>
</template>
<template v-else-if="sumWow < 0">
<el-icon style="color:forestgreen">
<ArrowDownBold />
<ArrowDownBold/>
</el-icon>
</template>
<template v-else>
<el-icon style="color:grey">
<SemiSelect />
<SemiSelect/>
</el-icon>
</template>
</el-col>
<el-col class="center-card">日环比:{{ sumDaily }}%&nbsp;&nbsp;&nbsp;&nbsp;
<template v-if="sumDaily > 0">
<el-icon style="color:red">
<ArrowUpBold />
<ArrowUpBold/>
</el-icon>
</template>
<template v-else-if="sumDaily < 0">
<el-icon style="color:forestgreen">
<ArrowDownBold />
<ArrowDownBold/>
</el-icon>
</template>
<template v-else>
<el-icon style="color:grey">
<SemiSelect />
<SemiSelect/>
</el-icon>
</template>
</el-col>
@ -143,21 +149,30 @@
<el-col :span="24">
<el-row>
<div style="margin-top:5px">合计&nbsp;&nbsp;&nbsp;&nbsp;
永久金币 {{ activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100
永久金币 {{
activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100
}}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币 {{ activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100
免费金币 {{
activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100
}}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币 {{ activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100
任务金币 {{
activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100
}}&nbsp;&nbsp;&nbsp;&nbsp;
</div>
<div @change="handleDatePickerChange">
<el-button @click="getToday()" label="day" style="margin-left:250px" :type="activeTimeRange === 'today' ? 'primary' : ''">今日</el-button>
<el-button @click="getWeek()" label="week" :type="activeTimeRange === 'week' ? 'primary' : ''">本周</el-button>
<el-button @click="getMonth()" label="month" :type="activeTimeRange === 'month' ? 'primary' : ''">本月</el-button>
<el-button @click="getYear()" label="year" :type="activeTimeRange === 'year' ? 'primary' : ''">本年</el-button>
<el-button @click="getToday()" label="day" style="margin-left:250px"
:type="activeTimeRange === 'today' ? 'primary' : ''">今日
</el-button>
<el-button @click="getWeek()" label="week" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
</el-button>
<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" />
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>
@ -167,9 +182,9 @@
<el-col :span="18">
<div class="bar">
<!-- <div v-if="chartLoading" class="loading-overlay">-->
<!-- <div class="loading-spinner"></div>-->
<!-- </div>-->
<!-- <div v-if="chartLoading" class="loading-overlay">-->
<!-- <div class="loading-spinner"></div>-->
<!-- </div>-->
<div ref="chartRef" style="width: 100%; height: 400px"></div>
</div>
@ -185,7 +200,11 @@
</el-select>
<el-table :data="tableData" height="320px">
<el-table-column prop="rank" label="排名" width="60" align="center"></el-table-column>
<el-table-column prop="market" label="地区" align="center"></el-table-column>
<el-table-column prop="market" label="地区" align="center">
<template #default="scope">
<span>{{ marketMapping[scope.row.market] || scope.row.market }}</span>
</template>
</el-table-column>
<el-table-column prop="coinAmount" label="金币数量" align="center">
<template #default="{ row }">
{{ row.coinAmount.toLocaleString() }}
@ -202,13 +221,15 @@
<script setup>
import * as echarts from 'echarts'
import { ref, onMounted, nextTick, watch, onUnmounted } from 'vue'
import {ref, onMounted, nextTick, watch, onUnmounted} from 'vue'
import API from '@/util/http'
import { ElMessage } from 'element-plus'
import {ElMessage} from 'element-plus'
import dayjs from 'dayjs';
import utc from 'dayjs-plugin-utc'
dayjs.extend(utc)
import { ArrowUpBold, ArrowDownBold, SemiSelect } from '@element-plus/icons-vue'
import {ArrowUpBold, ArrowDownBold, SemiSelect} from '@element-plus/icons-vue'
import {marketMapping} from "@/utils/marketMap.js";
//
const markets = ref([])
//
@ -284,7 +305,7 @@ const destroyChart = () => {
}
window.removeEventListener('resize', handleResize)
}
const formatDate = function(date) {
const formatDate = function (date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
@ -297,7 +318,7 @@ const formatDate = function(date) {
const getToday = function () {
const today = dayjs()
const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1,'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('看看dateRange', dateRange.value)
activeTimeRange.value = 'today' //
@ -307,8 +328,8 @@ const getToday = function () {
//
const getWeek = function () {
const today = dayjs()
const startTime = (today.startOf('week').add(1,'day')).format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1,'week').startOf('week').add(1,'day').format('YYYY-MM-DD HH:mm:ss')
const startTime = (today.startOf('week').add(1, 'day')).format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1, 'week').startOf('week').add(1, 'day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('看看dateRange', dateRange.value)
activeTimeRange.value = 'week' //
@ -319,7 +340,7 @@ const getWeek = function () {
const getMonth = function () {
const today = dayjs()
const startTime = today.startOf('month').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1,'month').startOf('month').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1, 'month').startOf('month').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('看看dateRange', dateRange.value)
activeTimeRange.value = 'month' //
@ -330,7 +351,7 @@ const getMonth = function () {
const getYear = function () {
const today = dayjs()
const startTime = today.startOf('year').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1,'year').startOf('year').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1, 'year').startOf('year').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('看看dateRange', dateRange.value)
activeTimeRange.value = 'year' //
@ -424,7 +445,7 @@ const processData = (data) => {
//
const getMarkets = async () => {
console.log("adminData",adminData.value.account)
console.log("adminData", adminData.value.account)
try {
const response = await API({
url: '/general/adminMarkets',
@ -454,7 +475,7 @@ const getChartData = async () => {
}
//
if(!dateRange.value || dateRange.value.length === 0){
if (!dateRange.value || dateRange.value.length === 0) {
getYear()
}
@ -590,7 +611,7 @@ const updateChart = (chartData) => {
initChart()
}
chartLoading.value = true
try{
try {
let series = []
let legend = []
@ -601,7 +622,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'recharge',
data: chartData.rechargePermanent,
itemStyle: { color: '#5470c6' },
itemStyle: {color: '#5470c6'},
barWidth: 30
},
{
@ -609,7 +630,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'recharge',
data: chartData.rechargeFree,
itemStyle: { color: '#91cc75' },
itemStyle: {color: '#91cc75'},
barWidth: 30
},
{
@ -617,7 +638,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'recharge',
data: chartData.rechargeTask,
itemStyle: { color: '#fac858' },
itemStyle: {color: '#fac858'},
barWidth: 30
}
]
@ -629,7 +650,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'consume',
data: chartData.consumePermanent,
itemStyle: { color: '#5470c6' },
itemStyle: {color: '#5470c6'},
barWidth: 30
},
{
@ -637,7 +658,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'consume',
data: chartData.consumeFree,
itemStyle: { color: '#91cc75' },
itemStyle: {color: '#91cc75'},
barWidth: 30
},
{
@ -645,7 +666,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'consume',
data: chartData.consumeTask,
itemStyle: { color: '#fac858' },
itemStyle: {color: '#fac858'},
barWidth: 30
}
]
@ -678,7 +699,7 @@ const updateChart = (chartData) => {
},
xAxis: {
type: 'category',
data: markets.value,
data: markets.value.map(m => marketMapping[m] || m),
axisLabel: {
interval: 0,
rotate: 30
@ -726,7 +747,7 @@ const handleTabChange = () => {
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('用户信息', adminData.value)
} catch (error) {
@ -736,10 +757,10 @@ const getAdminData = async function () {
//
const getCardData = async () => {
try {
const response = await API({ url: '/workbench/getCard', data: {} })
const response = await API({url: '/workbench/getCard', data: {}})
workDataUpdateTime.value = response.updateTime
//
sumWow.value = response.sumWow .toFixed(2)
sumWow.value = response.sumWow.toFixed(2)
//
sumDaily.value = response.sumDaily.toFixed(2)

Loading…
Cancel
Save