Compare commits

...

26 Commits

Author SHA1 Message Date
zry 23e2486ea8 完成充值消费明细的excel的导出功能 10 months ago
zry 81e2cf8fe5 Merge branch 'feat/zry' of http://39.101.133.168:8807/yanjiaqing/gold_vue into feat/zry 10 months ago
lihuilin ef1fe91676 Merge branch 'feat/zry' of http://39.101.133.168:8807/yanjiaqing/gold_vue into feat/zry 10 months ago
lihuilin 7a608d9168 0430整合完 10 months ago
zry ff8e4bcd7c Merge branch 'main' into feat/zry 10 months ago
zry 20623ef0ba 导出功能的完成自测bug修复完成 10 months ago
zry 26a0214276 合并完成导出excel找回 10 months ago
zry d1aaf0d4e8 测试合并branch 'feat/zry' 10 months ago
zry c1ff9eaca0 测试新的合并方案 10 months ago
zry 08c57ccb87 重做了客户金币明细的导出excel 10 months ago
zry aca98aa791 新增活动的警告修改 10 months ago
zry 26012f376d 延迟的更改与提交(合并) 10 months ago
zry 204ec99a95 合并 10 months ago
zry 5649b90cf7 已完成的合并 10 months ago
zry eaf90724fd 活动页数100删除,工作台 10 months ago
lihuilin a117177bbb 0428提测未整合 10 months ago
lihuilin 653532717b 三期bug结束 10 months ago
zry 6736959de2 按钮失效bug修复;商品对应接口改正... 10 months ago
zry 83a81b0eca .env.production的更改 10 months ago
zry 21fde0c627 1.上正式地址,2.修复金豆明细地区无法更新金豆总额的bug 10 months ago
zry 74b52628e0 1.修复了在金豆明细地区搜索条件时的金豆总额更新,2.合并了lhl分支3.上正式环境 10 months ago
zry fccafa7087 Merge branch 'lhl' of http://39.101.133.168:8807/yanjiaqing/gold_vue into lhl 10 months ago
zry 55cc8c7b81 创建了zry新分支并push代码 10 months ago
lihuilin 3ffaf69421 测试正式地址正常 10 months ago
lihuilin f454649913 整合完毕 10 months ago
lihuilin d9a91abab1 充值审核去空格尝试 10 months ago
  1. 6
      gold-system/.env.development
  2. 6
      gold-system/.env.production
  3. 22
      gold-system/.env.test
  4. 6
      gold-system/package-lock.json
  5. 2
      gold-system/src/api/index.js
  6. 2
      gold-system/src/store/area.js
  7. 4
      gold-system/src/util/request.js
  8. 30
      gold-system/src/views/audit/rechargeAudit.vue
  9. 10
      gold-system/src/views/audit/refundAudit.vue
  10. 15
      gold-system/src/views/consume/addConsume.vue
  11. 18
      gold-system/src/views/consume/allConsume.vue
  12. 15
      gold-system/src/views/goldBeen/addGoldenBeen.vue
  13. 39
      gold-system/src/views/goldBeen/goldenBeenBalance.vue
  14. 96
      gold-system/src/views/goldBeen/goldenBeenConsum.vue
  15. 558
      gold-system/src/views/goldBeen/goldenBeenDetail.vue
  16. 522
      gold-system/src/views/goldBeen/onLineDetail.vue
  17. 2
      gold-system/src/views/index.vue
  18. 10
      gold-system/src/views/login.vue
  19. 370
      gold-system/src/views/managerecharge/activity.vue
  20. 60
      gold-system/src/views/managerecharge/rate.vue
  21. 9
      gold-system/src/views/permissions/index.vue
  22. 16
      gold-system/src/views/recharge/addRecharge.vue
  23. 2
      gold-system/src/views/recharge/adminRecharge.vue
  24. 287
      gold-system/src/views/recharge/allRecharge.vue
  25. 16
      gold-system/src/views/refund/addRefund.vue
  26. 2
      gold-system/src/views/refund/allRefund.vue
  27. 759
      gold-system/src/views/usergold/index.vue
  28. 11
      gold-system/src/views/usergoldInfo/index.vue
  29. 2
      gold-system/src/views/workspace/index.vue
  30. 2
      gold-system/stats.html

6
gold-system/.env.development

@ -1 +1,5 @@
VITE_API_BASE='http://54.251.137.151:10704/'
# VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_prod'
#VITE_API_BASE='http://54.251.137.151:10704/'
# VITE_API_BASE='http://192.168.8.94:8080/'
VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_dev'
# VITE_API_BASE='http://192.168.8.220:8080/'

6
gold-system/.env.production

@ -1 +1,5 @@
VITE_API_BASE='http://54.251.137.151:10702/'
# VITE_API_BASE='http://54.251.137.151:10702/'
VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_prod'
# VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_dev'
# VITE_API_BASE='http://192.168.8.220:8080/'

22
gold-system/.env.test

@ -1 +1,21 @@
VITE_API_BASE='http://54.251.137.151:10704/'
<<<<<<< HEAD
<<<<<<< HEAD
#VITE_API_BASE='http://54.251.137.151:10704/'
# VITE_API_BASE='http://192.168.8.94:8080/'
VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_prod'
# VITE_API_BASE='http://54.251.137.151:10704/'
# VITE_API_BASE='http://192.168.8.232:8080/'
=======
# VITE_API_BASE='http://54.251.137.151:10704/'
# VITE_API_BASE='http://192.168.8.94:8080/'
VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_prod'
# VITE_API_BASE='http://54.251.137.151:10704/'
# VITE_API_BASE='http://192.168.8.220:8080/'
>>>>>>> zry
=======
# VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_prod'
#VITE_API_BASE='http://54.251.137.151:10704/'
# VITE_API_BASE='http://192.168.8.94:8080/'
VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_dev'
# VITE_API_BASE='http://192.168.8.232:8080/'
>>>>>>> a117177bbbe1dd3064874e0b27bedb0c3b15c3e3

6
gold-system/package-lock.json

@ -4093,9 +4093,8 @@
},
"node_modules/moment": {
"version": "2.30.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/moment/-/moment-2.30.1.tgz",
"resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
"license": "MIT",
"engines": {
"node": "*"
}
@ -4987,9 +4986,8 @@
},
"node_modules/xlsx": {
"version": "0.18.5",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/xlsx/-/xlsx-0.18.5.tgz",
"resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
"integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
"license": "Apache-2.0",
"dependencies": {
"adler-32": "~1.3.0",
"cfb": "~1.2.1",

2
gold-system/src/api/index.js

@ -1,6 +1,6 @@
import { pa } from 'element-plus/es/locales.mjs';
import http from '../util/http.js';
// 这个是不知道有啥用
const API={
post: function(url,data){
return http({url:url,method:'post',data:data})

2
gold-system/src/store/area.js

@ -1,5 +1,5 @@
import { defineStore } from 'pinia'
// 这个也是不知道有啥用,谁给在index.vue里注了
export const useAreaStore = defineStore('area', {
state: () => ({
currentArea: '全部',

4
gold-system/src/util/request.js

@ -1,11 +1,13 @@
import axios from 'axios'
// 创建axios实例
const service = axios.create({
baseURL: import.meta.env.VITE_API_BASE,
timeout: 10000,
headers: {
'Content-Type': 'application/json'
},
// 设置默认请求方法为 POST
// 设置请求头,指定请求体的格式为 JSON
// 设置默认请求方法为 POST 这行对应的代码搁哪呢?
})
// 请求拦截器

30
gold-system/src/views/audit/rechargeAudit.vue

@ -98,6 +98,10 @@ const trueGold = ref(0)
const trueCount = ref(0)
const trueRGold = ref(0)
const trueFGold = ref(0)
//
const formattedTrueGold = computed(() => trueGold.value.toFixed(2))
const formattedTrueRGold = computed(() => trueRGold.value.toFixed(2))
const formattedTrueFGold = computed(() => trueFGold.value.toFixed(2))
//
const pendingCount = ref(0)
//
@ -215,6 +219,7 @@ const get = async function (val) {
}
//
const search = function () {
trimJwCode();
getObj.value.pageNum = 1
get()
}
@ -410,7 +415,7 @@ const pass = function (row) {
passObj.value = row
passObj.value.adminId = adminData.value.adminId
passObj.value.auditId = row.auditId
passObj.value.status = 1
// passObj.value.status = 1
passObj.value.rechargeId = row.rechargeId
passObj.value.detailId = row.detailId
passObj.value.jwcode = row.jwcode
@ -424,6 +429,8 @@ const pass = function (row) {
//
const passConfirm = async function () {
try {
//
passObj.value.status = 1
console.log('通过对象', passObj.value)
// POST
// passObj.value.flag = 0;
@ -442,8 +449,12 @@ const passConfirm = async function () {
message: '通过成功!'
})
} catch (error) {
console.log('请求失败', error)
//
console.error('请求失败', error);
//
ElMessage({
type: 'error',
message: '网络请求出错,请检查网络连接!'
});
}
}
@ -538,6 +549,13 @@ const handleSortChange = (column) => {
sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
get()
}
//
const trimJwCode = () => {
if (rechargeVo.value.jwcode) {
rechargeVo.value.jwcode = rechargeVo.value.jwcode.replace(/\s/g, '');
}
}
</script>
<template>
@ -635,7 +653,7 @@ const handleSortChange = (column) => {
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button @click="reset()" type="success">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
</div>
</el-col>
@ -659,8 +677,8 @@ const handleSortChange = (column) => {
<div>
总条数{{ trueCount }}总金币数{{
trueGold
}}金币永久金币{{ trueRGold }}金币免费金币{{ trueFGold }}金币
formattedTrueGold
}}金币永久金币{{ formattedTrueRGold }}金币免费金币{{ formattedTrueFGold }}金币
</div>
</el-tabs>
<div style="height: 540px; overflow-y: auto">

10
gold-system/src/views/audit/refundAudit.vue

@ -181,6 +181,7 @@ const get = async function (val) {
}
//
const search = function () {
trimJwCode();
getObj.value.pageNum = 1
get()
}
@ -494,6 +495,13 @@ const handleSortChange = (column) => {
sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
get()
}
//
const trimJwCode = () => {
if (detail.value.jwcode) {
// 使
detail.value.jwcode = detail.value.jwcode.replace(/\s/g, '');
}
}
</script>
<template>
@ -591,7 +599,7 @@ const handleSortChange = (column) => {
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
</div>
</el-col>

15
gold-system/src/views/consume/addConsume.vue

@ -9,7 +9,12 @@ import API from "../../api/index.js";
import moment from "moment";
import _ from "lodash";
import request from "@/util/http";
//
const trimJwCode = () => {
if (addConsume.value.jwcode) {
addConsume.value.jwcode = addConsume.value.jwcode.replace(/\s/g, '');
}
}
//
const adminData = ref({});
const getAdminData = async function () {
@ -143,12 +148,13 @@ const user = ref({
firstRechargeTime: "",
});
const getUser = async function (jwcode) {
trimJwCode();
try {
// POST
const result = await request({
url: "/recharge/user",
data: {
jwcode: jwcode,
jwcode: addConsume.value.jwcode,
area: adminData.value.area,
},
});
@ -174,12 +180,13 @@ const getUser = async function (jwcode) {
//
const userGold = ref({});
const getUserGold = async function (jwcode) {
trimJwCode();
try {
// POST
const result = await request({
url: "/recharge/user",
data: {
jwcode: jwcode,
jwcode: addConsume.value.jwcode,
area: adminData.value.area,
},
});
@ -436,7 +443,7 @@ onMounted(async function () {
placeholder="提交人姓名"
/>
</el-form-item>
<el-button @click="delteConsume" style="margin-left: 280px">重置</el-button>
<el-button type="success" @click="delteConsume" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
</el-form>

18
gold-system/src/views/consume/allConsume.vue

@ -284,15 +284,14 @@ const getGoods = async function () {
try {
// POST
const result = await request({
url: '/product',
url: '/product/findProductName',
data: {}
})
//
console.log('请求成功', result)
console.log('请求成功product', result)
//
goods.value = result.data
console.log('allData', allData.value)
console.log('地区', area.value)
console.log('goods 数据', goods.value) //
} catch (error) {
console.log('请求失败', error)
//
@ -344,11 +343,12 @@ const handleCurrentChange = function (val) {
style="width: 240px"
clearable
>
<!-- 修改 v-for 绑定逻辑 -->
<el-option
v-for="item in goods"
:key="item.activityId"
:label="item.name"
:value="item.name"
v-for="(item, index) in goods"
:key="index"
:label="item"
:value="item"
/>
</el-select>
</div>
@ -412,7 +412,7 @@ const handleCurrentChange = function (val) {
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
</div>
</el-col>

15
gold-system/src/views/goldBeen/addGoldenBeen.vue

@ -14,7 +14,7 @@
<el-input v-model="beenObj.jwcode" style="width: 220px" />
<el-button
type="primary"
@click="getUser(beenObj.jwcode)"
@click="getUser()"
style="margin-left: 20px"
>查询</el-button
>
@ -62,7 +62,7 @@
</el-form-item> -->
<el-form-item>
<div class="btn-group">
<el-button @click="resetData(ruleFormRef)">重置</el-button>
<el-button type="success" @click="resetData(ruleFormRef)">重置</el-button>
<el-button type="primary" @click="addBean(ruleFormRef)">
提交
</el-button>
@ -150,13 +150,20 @@ const resetData = (formEl) => {
if (!formEl) return
formEl.resetFields()
}
const getUser = async function (jwcode) {
//
const trimJwCode = () => {
if (beenObj.value.jwcode) {
beenObj.value.jwcode = beenObj.value.jwcode.replace(/\s/g, '');
}
}
const getUser = async function () {
trimJwCode();
try {
// POST
const result = await API({
url: '/dou/search',
data: {
jwcode: jwcode
jwcode: beenObj.value.jwcode
}
})
if (result.code === 0) {

39
gold-system/src/views/goldBeen/goldenBeenBalance.vue

@ -1,14 +1,17 @@
<template>
<!-- 这是客户金豆余额页面 -->
<div class="filter-box">
<el-form :model="detailY" ref="ruleFormRef">
<el-form-item prop="jwcode" label="精网号">
<el-form-item prop="jwcode">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input
v-model="detailY.jwcode"
placeholder="请输入精网号"
style="width: 220px"
/>
</el-form-item>
<el-form-item prop="area" label="地区">
<el-form-item prop="area">
<el-text class="mx-1" size="large">地区</el-text>
<el-select
v-model="detailY.area"
placeholder="请选择所属地区"
@ -24,21 +27,21 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" @click="search()"
<el-button type="primary" @click="search()"
>查询</el-button
>
<el-button type="primary" size="small" @click="reset(ruleFormRef)"
<el-button type="success" @click="reset(ruleFormRef)"
>重置</el-button
>
</el-form-item>
</el-form>
</div>
<div class="table-box">
<p>
现有金豆:&nbsp;&nbsp;付费金豆:{{ getObj.jinbiBuy }}&nbsp;&nbsp;免费金豆:{{
<div>
现有金豆&nbsp;&nbsp;付费金豆{{ getObj.jinbiBuy }}&nbsp;&nbsp;免费金豆{{
getObj.jinbiFree
}}&nbsp;&nbsp;历史消费:{{ getObj.jinbiCostTotal }}
</p>
}}&nbsp;&nbsp;历史消费{{ getObj.jinbiCostTotal }}
</div>
<el-table
:data="tableData"
style="width: 100%"
@ -118,7 +121,14 @@ let getObj = ref({
jinbiCostTotal: 0,
jinbiFree: 0
})
//
const trimJwCode = () => {
if (detailY.jwcode) {
detailY.jwcode = detailY.jwcode.replace(/\s/g, '');
}
}
const search = function () {
trimJwCode();
getInit({})
getCount()
}
@ -186,15 +196,24 @@ const getArea = async () => {
}
}
const getCount = async () => {
try {
const result = await API({
url: '/dou/getYveTotal'
url: '/dou/getYveTotal',
// jwcodeipAddress
data: {
jwcode: detailY.jwcode,
ipAddress: detailY.area
}
})
if (result.code == 200) {
if (result.code === 200) {
const { jinbiBuy, jinbiFree, jinbiCostTotal } = result.data
getObj.value.jinbiBuy = jinbiBuy
getObj.value.jinbiFree = jinbiFree
getObj.value.jinbiCostTotal = jinbiCostTotal
}
} catch (error) {
console.log('获取统计数据失败', error)
}
}
getArea()
getCount()

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

@ -1,14 +1,17 @@
<template>
<!-- 这是金豆消费明细页面 -->
<div class="filter-box">
<el-form :model="detailY" ref="ruleFormRef">
<el-form-item prop="jwcode" label="精网号">
<el-form-item prop="jwcode">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input
v-model="detailY.jwcode"
placeholder="请输入精网号"
style="width: 220px"
/>
</el-form-item>
<el-form-item prop="ipAddress" label="地区">
<el-form-item prop="ipAddress">
<el-text class="mx-1" size="large">地区</el-text>
<el-select
v-model="detailY.ipAddress"
placeholder="请选择所属地区"
@ -23,7 +26,8 @@
/>
</el-select>
</el-form-item>
<el-form-item prop="sourceType" label="消费类型">
<el-form-item prop="sourceType">
<el-text class="mx-1" size="large">消费类型</el-text>
<el-select
v-model="detailY.sourceType"
placeholder="请选择消费类型"
@ -54,23 +58,38 @@
/>
</el-select>
</el-form-item> -->
<el-form-item prop="sourceName" label="直播间">
<el-form-item prop="sourceName">
<el-text class="mx-1" size="large">直播间</el-text>
<el-input
v-model="detailY.sourceName"
placeholder="请输入直播间"
style="width: 220px"
/>
</el-form-item>
<el-form-item prop="createTime" label="消费时间">
<el-form-item prop="startTime">
<el-text class="mx-1" size="large">开始时间</el-text>
<el-date-picker
v-model="detailY.createTime"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="YYYY-MM-DD HH:mm:ss"
v-model="detailY.startTime"
type="date"
placeholder="开始日期"
style="width: 240px"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item prop="endTime">
<el-text class="mx-1" size="large">结束时间</el-text>
<el-date-picker
v-model="detailY.endTime"
type="date"
placeholder="结束日期"
style="width: 240px"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
<el-button style="margin-left: 10px" @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
@ -79,7 +98,7 @@
</el-form>
</div>
<div class="table-box">
<p>合计数:实际用户金豆数:{{ beenCount }}</p>
<div>合计数实际用户金豆数{{ beenCount }}</div>
<el-table :data="tableData" style="width: 100%" height="584px">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
@ -149,7 +168,7 @@
<script setup lang="ts">
import { ref } from 'vue'
import type { FormInstance } from 'element-plus'
import { ElMessage } from 'element-plus'
// import { ElMessage } from 'element-plus'
import moment from 'moment'
import API from '@/util/http'
@ -172,14 +191,15 @@ const consumList = ref<any>([
{ value: 10, text: '打赏视频' },
{ value: 11, text: '付费购买' }
])
const channelList = ref<string[]>([])
const liveroomList = ref<string[]>([])
// const channelList = ref<string[]>([])
// const liveroomList = ref<string[]>([])
const ruleFormRef = ref<FormInstance>()
//
const detailY = ref({
jwcode: '',
ipAddress: '',
createTime: '',
startTime:'',
endTime:'',
// channel: '', //
sourceName: '', //
sourceType: '' //
@ -188,11 +208,44 @@ const getObj = ref({
pageNum: 1,
pageSize: 50
})
//
const getToday = function () {
const today = new Date()
//
const startDate = moment(today).startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
const endDate = moment(today).endOf('day').format('YYYY-MM-DD HH:mm:ss')
detailY.value.startTime = startDate
detailY.value.endTime = endDate
search()
}
//
const getYesterday = function () {
const yesterday = moment().subtract(1, 'days')
//
const startDate = yesterday.startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
const endDate = yesterday.endOf('day').format('YYYY-MM-DD HH:mm:ss')
detailY.value.startTime = startDate
detailY.value.endTime = endDate
search()
}
// 7
const get7Days = function () {
//
const startDate = moment().subtract(6, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
const endDate = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
detailY.value.startTime = startDate
detailY.value.endTime = endDate
search()
}
//
const getInit = async function () {
try {
console.log('搜索参数', getObj.value)
const [startTime, endTime] = detailY.value.createTime
const startTime = detailY.value.startTime
const endTime = detailY.value.endTime
// POST
const result = await API({
url: '/dou/getSpend',
@ -218,8 +271,19 @@ const getInit = async function () {
//
}
}
//
const trimJwCode = () => {
if (detailY.value.jwcode) {
detailY.value.jwcode = detailY.value.jwcode.replace(/\s/g, '');
}
if (detailY.value.sourceName) {
detailY.value.sourceName = detailY.value.sourceName.replace(/\s/g, '');
}
}
//
const search = function () {
trimJwCode();
getObj.value.pageNum = 1
getInit()
getCount()

558
gold-system/src/views/goldBeen/goldenBeenDetail.vue

@ -1,14 +1,17 @@
<template>
<!-- 这是金豆充值明细页面 -->
<div class="filter-box">
<el-form :model="detailY" ref="ruleFormRef">
<el-form-item prop="jwcode" label="精网号">
<el-form-item prop="jwcode">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input
v-model="detailY.jwcode"
placeholder="请输入精网号"
style="width: 220px"
/>
</el-form-item>
<el-form-item prop="deptName" label="地区">
<el-form-item prop="deptName" >
<el-text class="mx-1" size="large">地区</el-text>
<el-select
v-model="detailY.deptName"
placeholder="请选择所属地区"
@ -23,14 +26,16 @@
/>
</el-select>
</el-form-item>
<el-form-item prop="orderNo" label="订单号">
<el-form-item prop="orderNo" >
<el-text class="mx-1" size="large">订单号</el-text>
<el-input
v-model="detailY.orderNo"
placeholder="请输入订单号"
style="width: 220px"
/>
</el-form-item>
<el-form-item prop="type" label="充值类型">
<el-form-item prop="type">
<el-text class="mx-1" size="large">充值类型</el-text>
<el-input
v-model="detailY.type"
placeholder="请输入充值类型"
@ -52,30 +57,98 @@
/>
</el-select>
</el-form-item> -->
<el-form-item prop="createTime" label="充值时间">
<el-form-item prop="startTime">
<el-text class="mx-1" size="large">开始时间</el-text>
<el-date-picker
v-model="detailY.createTime"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
v-model="detailY.startTime"
type="date"
placeholder="开始日期"
style="width: 240px"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
:unlinkPanels="true"
/>
</el-form-item>
<el-form-item prop="endTime">
<el-text class="mx-1" size="large">结束时间</el-text>
<el-date-picker
v-model="detailY.endTime"
type="date"
placeholder="结束日期"
style="width: 240px"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-button style="margin-left: 10px" @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
<el-button type="success" @click="reset(ruleFormRef)">重置</el-button>
<el-button type="primary" @click="exportExcel">导出excel</el-button>
<el-button type="primary" @click="showExportInfoPanel = true">导出excel</el-button>
</el-form-item>
</el-form>
</div>
<!-- 导出excel提前展示的信息面板 -->
<el-dialog
v-model="showExportInfoPanel"
title="导出信息确认"
width="400px"
:close-on-click-modal="false"
>
<div class="info-panel-header">导出信息</div>
<div v-if="!detailY.jwcode && !detailY.deptName && !detailY.orderNo && !detailY.type && !detailY.startTime && !detailY.endTime">
你正在导出所有数据
</div>
<div v-else>
你正在导出以下数据
</div>
<div v-if="detailY.jwcode">精网号{{ detailY.jwcode || '' }}</div>
<div v-if="detailY.deptName">所属地区{{ detailY.deptName || '' }}</div>
<div v-if="detailY.orderNo">订单号{{ detailY.orderNo || '' }}</div>
<div v-if="detailY.type">充值类型{{ detailY.type || '' }}</div>
<div v-if="detailY.startTime || detailY.endTime">
<span>更新时间</span>
<span>{{ detailY.startTime || '无起始时间' }} {{ detailY.endTime || '无结束时间' }}</span>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="showExportInfoPanel = false">取消</el-button>
<el-button type="primary" @click="doExportExcel">导出</el-button>
</span>
</template>
</el-dialog>
<!-- 导出进度弹窗 -->
<el-dialog
v-model="isExporting"
title="正在导出"
width="400px"
:close-on-click-modal="false"
:show-close="false"
>
<el-progress
:percentage="exportProgress"
:stroke-width="15"
striped
animated
/>
<div class="export-status">
已导出 {{ exportedCount }} / {{ totalExport }}
</div>
<template #footer>
<el-button type="danger" @click="cancelExport">取消导出</el-button>
</template>
</el-dialog>
<div class="table-box">
<el-card
>金豆总数充值金豆总数{{ countValue }}合计金额数:{{
<div
>金豆总数充值金豆总数{{ countValue }}合计金额数{{
priceValue
}}</el-card
}}</div
>
<el-table :data="tableData" style="width: 100%" height="584px">
<el-table-column type="index" label="序号" width="100px" fixed="left">
@ -130,7 +203,7 @@
</div>
</div>
<!-- 这是导出excel的弹窗 -->
<el-dialog
<!-- <el-dialog
v-model="dialogVisible"
title="请选择导出条件"
width="500"
@ -192,16 +265,144 @@
>
</el-form>
</template>
</el-dialog>
</el-dialog> -->
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import { reactive, ref, onMounted, onUnmounted } from 'vue'
import { FormInstance } from 'element-plus'
import { ElMessage } from 'element-plus'
import moment from 'moment'
import API from '@/util/http'
import { utils, write } from 'xlsx'
import { saveAs } from 'file-saver'
const showExportInfoPanel = ref(false)
const isExporting = ref(false)
const exportProgress = ref(0)
const totalExport = ref(0)
const exportedCount = ref(0)
let cancelToken: any = null
let allExportData: any[] = []
//
const cancelExport = () => {
if (cancelToken) {
cancelToken.cancel('导出已取消')
}
isExporting.value = false
exportProgress.value = 0
exportedCount.value = 0
allExportData = []
ElMessage.info('导出已取消')
}
// Excel
const doExportExcel = async () => {
try {
isExporting.value = true
exportProgress.value = 0
exportedCount.value = 0
allExportData = []
//
const totalResult = await API({
url: '/dou/getPay',
data: {
pay: {
jwcode: detailY.value.jwcode,
deptName: detailY.value.deptName,
startTime: detailY.value.startTime || '',
endTime: detailY.value.endTime || '',
payStyle: detailY.value.payStyle,
type: detailY.value.type,
orderNo: detailY.value.orderNo,
sortField: '',
sortOrder: ''
},
pageNum: 1,
pageSize: 1
}
})
totalExport.value = totalResult.data.total
if (totalExport.value === 0) {
ElMessage.error('没有数据可导出')
isExporting.value = false
return
}
const pageSize = 5000 // 100
const totalPages = Math.ceil(totalExport.value / pageSize)
for (let page = 1; page <= totalPages; page++) {
if (!isExporting.value) break //
const result = await API({
url: '/dou/getPay',
data: {
pay: {
jwcode: detailY.value.jwcode,
deptName: detailY.value.deptName,
startTime: detailY.value.startTime || '',
endTime: detailY.value.endTime || '',
payStyle: detailY.value.payStyle,
type: detailY.value.type,
orderNo: detailY.value.orderNo,
sortField: '',
sortOrder: ''
},
pageNum: page,
pageSize: pageSize
}
})
const data = result.data.list
allExportData = allExportData.concat(data)
exportedCount.value = allExportData.length
exportProgress.value = Math.round((exportedCount.value / totalExport.value) * 100)
}
if (isExporting.value) {
//
const exportData = allExportData.map((item, index) => {
return {
序号: index + 1, //
姓名: item.nickname,
精网号: item.jwcode,
地区: item.ipAddress,
订单号: item.orderNo,
金豆数量: item.money,
付费金豆: item.moneyBuy,
免费金豆: item.moneyFree,
金额: item.price,
类型: item.type,
充值时间: !!item.time ? moment.unix(item.time).format('YYYY-MM-DD HH:mm:ss') : '-'
}
})
const worksheet = utils.json_to_sheet(exportData)
const workbook = utils.book_new()
utils.book_append_sheet(workbook, worksheet, 'Sheet1')
const wbout = write(workbook, { bookType: 'xlsx', type: 'array' })
saveAs(
new Blob([wbout], { type: 'application/octet-stream' }),
'金豆充值明细导出.xlsx'
)
showExportInfoPanel.value = false
isExporting.value = false
ElMessage.success('导出成功')
}
} catch (error) {
if (error.message === '导出已取消') {
return
}
console.log('导出失败', error)
isExporting.value = false
ElMessage.error('导出失败,请稍后重试')
}
}
//
const tableData = ref([])
//
@ -216,12 +417,56 @@ const excelData = reactive({
})
const priceValue = ref(0)
const countValue = ref(0)
// areaList
const areaList = ref<string[]>([])
const isExport = ref<boolean>(false)
const rules = ref({
jwcode: [{ required: true, message: '请输入精网号', trigger: 'blur' }],
area: [{ required: true, message: '请选择所属地区', trigger: 'change' }]
})
//
const getToday = function () {
const today = new Date()
//
const startDate = moment(today).startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
const endDate = moment(today).endOf('day').format('YYYY-MM-DD HH:mm:ss')
detailY.value.startTime = startDate
detailY.value.endTime = endDate
search()
}
//
const getYesterday = function () {
const yesterday = moment().subtract(1, 'days')
//
const startDate = yesterday.startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
const endDate = yesterday.endOf('day').format('YYYY-MM-DD HH:mm:ss')
detailY.value.startTime = startDate
detailY.value.endTime = endDate
search()
}
// 7
const get7Days = function () {
//
const startDate = moment().subtract(6, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
const endDate = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
detailY.value.startTime = startDate
detailY.value.endTime = endDate
search()
}
//
const getArea = async () => {
try {
const result = await API({
url: '/dou/getPayIp'
})
areaList.value = result.data
} catch (error) {
console.log('请求失败', error)
}
}
const handlePageSizeChange = (val) => {
getObj.value.pageSize = val
getObj.value.pageNum = 1
@ -239,13 +484,13 @@ const platformList = ref<string[]>([
// 'system',
// ''
])
const typeList = ref<string[]>([
'金币换金豆',
'金币换免费金豆',
'赠送金豆',
'购买金豆',
'客服操作'
])
// const typeList = ref<string[]>([
// '',
// '',
// '',
// '',
// ''
// ])
//
const detailY = ref({
jwcode: '',
@ -253,84 +498,85 @@ const detailY = ref({
orderNo: '',
payStyle: '',
type: '',
createTime: ''
startTime:'',
endTime:''
})
const getObj = ref({
pageNum: 1,
pageSize: 50
})
const exportExcel = function () {
dialogVisible.value = true
isExport.value = true
}
const exportConfirm = function () {
if (excelData.timegap == '1') {
excelData.startTime = moment().startOf('day').format('YYYY-MM-DD HH:mm:ss')
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
} else if (excelData.timegap == '3') {
excelData.startTime = moment()
.subtract(3, 'days')
.startOf('day')
.format('YYYY-MM-DD HH:mm:ss')
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
} else if (excelData.timegap == '7') {
excelData.startTime = moment()
.subtract(7, 'days')
.startOf('day')
.format('YYYY-MM-DD')
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
} else if (excelData.timegap == '30') {
excelData.startTime = moment()
.subtract(30, 'days')
.startOf('day')
.format('YYYY-MM-DD HH:mm:ss')
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
}
getInit(
{
sortField: '',
sortOrder: ''
},
(data) => {
console.log('导出数据', data)
//
data = data.map((item) => {
return {
姓名: item.name,
精网号: item.jwcode,
地区: item.deptName,
订单号: item.orderNo,
充值平台: item.payStyle,
金豆数量: item.count,
充值时间: moment(item.successTime).format('YYYY-MM-DD'),
金额: item.price
}
})
if (data.length == 0) {
ElMessage.error('没有数据')
isExport.value = false
dialogVisible.value = false
return
}
console.log('导出数据', data)
excelExport(data)
}
)
}
// const exportExcel = function () {
// dialogVisible.value = true
// isExport.value = true
// }
// const exportConfirm = function () {
// if (excelData.timegap == '1') {
// excelData.startTime = moment().startOf('day').format('YYYY-MM-DD HH:mm:ss')
// excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
// } else if (excelData.timegap == '3') {
// excelData.startTime = moment()
// .subtract(3, 'days')
// .startOf('day')
// .format('YYYY-MM-DD HH:mm:ss')
// excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
// } else if (excelData.timegap == '7') {
// excelData.startTime = moment()
// .subtract(7, 'days')
// .startOf('day')
// .format('YYYY-MM-DD')
// excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
// } else if (excelData.timegap == '30') {
// excelData.startTime = moment()
// .subtract(30, 'days')
// .startOf('day')
// .format('YYYY-MM-DD HH:mm:ss')
// excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
// }
// getInit(
// {
// sortField: '',
// sortOrder: ''
// },
// (data) => {
// console.log('', data)
// //
// data = data.map((item) => {
// return {
// : item.name,
// : item.jwcode,
// : item.deptName,
// : item.orderNo,
// : item.payStyle,
// : item.count,
// : moment(item.successTime).format('YYYY-MM-DD'),
// : item.price
// }
// })
// if (data.length == 0) {
// ElMessage.error('')
// isExport.value = false
// dialogVisible.value = false
// return
// }
// console.log('', data)
// excelExport(data)
// }
// )
// }
//excel
const excelExport = async function (data) {
const worksheet = utils.json_to_sheet(data)
const workbook = utils.book_new()
utils.book_append_sheet(workbook, worksheet, 'Sheet1')
// const excelExport = async function (data) {
// const worksheet = utils.json_to_sheet(data)
// const workbook = utils.book_new()
// utils.book_append_sheet(workbook, worksheet, 'Sheet1')
const wbout = write(workbook, { bookType: 'xlsx', type: 'array' })
saveAs(
new Blob([wbout], { type: 'application/octet-stream' }),
'数据导出.xlsx'
)
isExport.value = false
dialogVisible.value = false
}
// const wbout = write(workbook, { bookType: 'xlsx', type: 'array' })
// saveAs(
// new Blob([wbout], { type: 'application/octet-stream' }),
// '.xlsx'
// )
// isExport.value = false
// dialogVisible.value = false
// }
const ruleFormRef = ref<FormInstance>()
//
const getInit = async function (
@ -341,53 +587,67 @@ const getInit = async function (
sortField?: string
sortOrder?: string
},
callback?: Function
// callback?: Function
) {
try {
console.log('搜索参数', getObj.value)
const [startTime, endTime] = detailY.value.createTime
const startTime = detailY.value.startTime
const endTime = detailY.value.endTime
console.log(startTime, endTime)
// POST
const result = await API({
url: '/dou/getPay',
data: {
pay: {
jwcode: isExport.value ? excelData.jwcode : detailY.value.jwcode,
deptName: isExport.value ? excelData.area : detailY.value.deptName,
startTime: isExport.value ? excelData.startTime : startTime || '',
endTime: isExport.value ? excelData.endTime : endTime || '',
payStyle: isExport.value ? '' : detailY.value.payStyle,
type: isExport.value ? '' : detailY.value.type,
orderNo: isExport.value ? '' : detailY.value.orderNo,
jwcode: detailY.value.jwcode,
deptName: detailY.value.deptName,
startTime: detailY.value.startTime || '',
endTime: detailY.value.endTime || '',
payStyle: detailY.value.payStyle,
type: detailY.value.type,
orderNo: detailY.value.orderNo,
sortField,
sortOrder
},
pageNum: isExport.value ? '' : getObj.value.pageNum,
pageSize: isExport.value ? '' : getObj.value.pageSize
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize
}
})
if (isExport.value) {
!!callback && callback(result.data)
} else {
// if (isExport.value) {
// !!callback && callback(result.data)
// } else {
tableData.value = result.data.list
total.value = result.data.total
}
// }
} catch (error) {
console.log('请求失败', error)
//
}
}
// const handleSortChange = (column) => {
// const { prop, order } = column
// if (order === 'ascending') {
// getInit({ sortField: prop, sortOrder: 'ASC' })
// } else if (order === 'descending') {
// getInit({ sortField: prop, sortOrder: 'DESC' })
// }
// }
const handleSortChange = (column) => {
const { prop, order } = column
if (order === 'ascending') {
getInit({ sortField: prop, sortOrder: 'ASC' })
} else if (order === 'descending') {
getInit({ sortField: prop, sortOrder: 'DESC' })
}
}
//
const trim = () => {
if (detailY.value.jwcode) {
detailY.value.jwcode = detailY.value.jwcode.replace(/\s/g, '');
}
if (detailY.value.orderNo) {
detailY.value.orderNo = detailY.value.orderNo.replace(/\s/g, '');
}
if (detailY.value.type) {
detailY.value.type = detailY.value.type.replace(/\s/g, '');
}
}
//
const search = function () {
trim();
getObj.value.pageNum = 1
getInit({})
getCount()
@ -396,17 +656,7 @@ const search = function () {
const reset = function (formEl) {
formEl.resetFields()
}
//
const getArea = async () => {
try {
const result = await API({
url: '/dou/getPayIp'
})
areaList.value = result.data
} catch (error) {
console.log('请求失败', error)
}
}
//
const getPayType = async () => {
try {
@ -426,9 +676,9 @@ const getCount = async () => {
url: '/dou/getTotal',
data: {
jwcode: detailY.value.jwcode,
//deptName: detailY.value.deptName,
startTime: detailY.value.createTime[0],
endTime: detailY.value.createTime[1],
deptName: detailY.value.deptName,
startTime: detailY.value.startTime,
endTime: detailY.value.endTime,
orderNo: detailY.value.orderNo,
type: detailY.value.type
// payStyle: detailY.value.payStyle
@ -447,10 +697,13 @@ const getCount = async () => {
console.log('请求失败', error)
}
}
getInit({})
getArea()
getPayType()
getCount()
onMounted(() => {
getInit({})
getPayType()
getCount()
getArea()
})
</script>
<style scoped lang="scss">
.filter-box {
@ -483,4 +736,37 @@ getCount()
align-items: center;
margin-top: 10px;
}
.filter-box {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
padding-bottom: 0px;
box-sizing: border-box;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
border-radius: 5px;
.el-form {
display: flex;
flex-wrap: wrap;
row-gap: 20px;
column-gap: 20px;
}
}
.table-box {
width: 100%;
padding: 20px;
box-sizing: border-box;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
border-radius: 5px;
}
.pagination {
display: flex;
align-items: center;
margin-top: 10px;
}
</style>

522
gold-system/src/views/goldBeen/onLineDetail.vue

@ -1,14 +1,19 @@
<template>
<!-- 这是线上充值明细页面 -->
<!-- 这是搜索表单 -->
<div class="filter-box">
<el-form :model="detailY" ref="ruleFormRef">
<el-form-item prop="jwcode" label="精网号">
<el-form-item prop="jwcode">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input
v-model="detailY.jwcode"
placeholder="请输入精网号"
style="width: 220px"
/>
</el-form-item>
<el-form-item prop="deptName" label="地区">
<el-form-item prop="deptName">
<el-text class="mx-1" size="large">地区</el-text>
<el-select
v-model="detailY.deptName"
placeholder="请选择所属地区"
@ -23,21 +28,16 @@
/>
</el-select>
</el-form-item>
<el-form-item prop="orderNo" label="订单号">
<el-form-item prop="orderNo">
<el-text class="mx-1" size="large">订单号</el-text>
<el-input
v-model="detailY.orderNo"
placeholder="请输入订单号"
style="width: 220px"
/>
</el-form-item>
<!-- <el-form-item prop="type" label="充值类型">
<el-input
v-model="detailY.type"
placeholder="请输入充值类型"
style="width: 220px"
/>
</el-form-item> -->
<el-form-item prop="payStyle" label="充值平台">
<el-form-item prop="payStyle">
<el-text class="mx-1" size="large">充值平台</el-text>
<el-select
v-model="detailY.payStyle"
placeholder="请选择充值平台"
@ -52,7 +52,8 @@
/>
</el-select>
</el-form-item>
<el-form-item prop="createTime" label="充值时间">
<el-form-item prop="createTime">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker
v-model="detailY.createTime"
type="daterange"
@ -63,16 +64,21 @@
value-format="YYYY-MM-DD HH:mm:ss"
:unlinkPanels="true"
/>
<el-button style="margin-left: 10px" @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</el-form-item>
<el-col :span="10">
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
<el-button type="success" @click="reset(ruleFormRef)">重置</el-button>
<el-button type="primary" @click="exportExcel">导出excel</el-button>
<el-button type="primary" @click="showExportInfoPanel = true">导出excel</el-button>
</el-form-item>
</el-col>
</el-form>
</div>
<div class="table-box">
<p>金豆总数充值金豆总数{{ countValue }}合计金额数:{{ priceValue }}</p>
<div>金豆总数充值金豆总数{{ countValue }}合计金额数{{ priceValue }}</div>
<el-table :data="tableData" style="width: 100%" height="584px">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
@ -85,17 +91,9 @@
<el-table-column fixed="left" prop="jwcode" label="精网号" width="120" />
<el-table-column prop="deptName" label="地区" width="120" />
<el-table-column prop="orderNo" label="订单号" width="120" />
<el-table-column prop="count" label="金豆数量" width="120">
</el-table-column>
<!-- <el-table-column prop="moneyBuy" label="付费金豆" width="120">
</el-table-column>
<el-table-column prop="moneyFree" label="免费金豆" width="120">
</el-table-column> -->
<el-table-column prop="price" label="金额"></el-table-column>
<!-- <el-table-column prop="type" label="类型"></el-table-column> -->
<el-table-column prop="payStyle" label="充值平台" width="140">
</el-table-column>
<!-- <el-table-column prop="notes" label="备注" width="210"></el-table-column> -->
<el-table-column prop="count" label="金豆数量" width="120" />
<el-table-column prop="price" label="金额" />
<el-table-column prop="payStyle" label="充值平台" width="140" />
<el-table-column
prop="successTime"
label="充值时间"
@ -105,7 +103,7 @@
<template #default="scope">
<span>{{
!!scope.row.successTime
? moment.unix(scope.row.time).format('YYYY-MM-DD HH:mm:ss')
? moment.unix(scope.row.successTime).format('YYYY-MM-DD HH:mm:ss')
: '-'
}}</span>
</template>
@ -125,91 +123,73 @@
</el-pagination>
</div>
</div>
<!-- 这是导出excel的弹窗 -->
<!-- 导出excel提前展示的信息面板 -->
<el-dialog
v-model="dialogVisible"
title="请选择导出条件"
width="500"
v-model="showExportInfoPanel"
title="导出信息确认"
width="400px"
:close-on-click-modal="false"
@close="
() => {
dialogVisible = false
isExport = false
}
"
>
<div class="info-panel-header">导出信息</div>
<div v-if="!detailY.jwcode && !detailY.deptName && !detailY.orderNo && !detailY.payStyle && (!Array.isArray(detailY.createTime) || !detailY.createTime.length)">
你正在导出所有数据
</div>
<div v-else>
你正在导出以下数据
</div>
<div v-if="detailY.jwcode">精网号{{ detailY.jwcode || '' }}</div>
<div v-if="detailY.deptName">所属地区{{ detailY.deptName || '' }}</div>
<div v-if="detailY.orderNo">订单号{{ detailY.orderNo || '' }}</div>
<div v-if="detailY.payStyle">充值平台{{ platformList.find(item => item === detailY.payStyle) || '' }}</div>
<div v-if="Array.isArray(detailY.createTime) && detailY.createTime.length">
<span>更新时间</span>
<span>{{ detailY.createTime[0] || '无起始时间' }} {{ detailY.createTime[1] || '无结束时间' }}</span>
</div>
<template #footer>
<el-form
ref="ruleFormRef"
style="max-width: 600px"
:model="excelData"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
status-icon
>
<el-form-item prop="activityName" label="精网号:">
<el-input
v-model="excelData.jwcode"
placeholder="请输入精网号"
style="width: 220px"
/>
</el-form-item>
<el-form-item label="所属地区:"
><el-select
v-model="excelData.area"
placeholder="请选择所属地区"
style="width: 240px"
clearable
>
<el-option
v-for="item in areaList"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<span class="dialog-footer">
<el-button @click="showExportInfoPanel = false">取消</el-button>
<el-button type="primary" @click="doExportExcel">导出</el-button>
</span>
</template>
</el-dialog>
<el-form-item label="更新时间:">
<el-radio-group v-model="excelData.timegap">
<el-radio value="1">今天</el-radio>
<el-radio value="3">近三天</el-radio>
<el-radio value="7">近一周</el-radio>
<el-radio value="30">近一个月</el-radio>
</el-radio-group>
</el-form-item>
<el-button
type="primary"
size="small"
style="margin-left: 10px"
@click="exportConfirm()"
>确定</el-button
<!-- 导出进度弹窗 -->
<el-dialog
v-model="isExporting"
title="正在导出"
width="400px"
:close-on-click-modal="false"
:show-close="false"
>
</el-form>
<el-progress
:percentage="exportProgress"
:stroke-width="15"
striped
animated
/>
<div class="export-status">
已导出 {{ Math.round((exportProgress / 100) * totalExport) }} / {{ totalExport }}
</div>
<template #footer>
<el-button type="danger" @click="cancelExport">取消导出</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import { reactive, ref, onMounted } from 'vue'
import { FormInstance } from 'element-plus'
import { ElMessage } from 'element-plus'
import moment from 'moment'
import API from '@/util/http'
import { utils, write } from 'xlsx'
import { saveAs } from 'file-saver'
//
const tableData = ref([])
//
//
const total = ref(100)
const dialogVisible = ref(false)
const excelData = reactive({
jwcode: '',
area: '',
timegap: '',
startTime: '',
endTime: ''
})
const priceValue = ref(0)
const countValue = ref(0)
const areaList = ref<string[]>([])
@ -218,181 +198,137 @@ const rules = ref({
jwcode: [{ required: true, message: '请输入精网号', trigger: 'blur' }],
area: [{ required: true, message: '请选择所属地区', trigger: 'change' }]
})
const handlePageSizeChange = (val) => {
const platformList = ref<string[]>([])
//
const getToday = () => {
const today = new Date()
//
const startDate = moment(today).startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
const endDate = moment(today).endOf('day').format('YYYY-MM-DD HH:mm:ss')
detailY.value.createTime = [startDate, endDate]
search()
}
//
const getYesterday = () => {
const yesterday = moment().subtract(1, 'days')
//
const startDate = yesterday.startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
const endDate = yesterday.endOf('day').format('YYYY-MM-DD HH:mm:ss')
detailY.value.createTime = [startDate, endDate]
search()
}
// 7
const get7Days = () => {
//
const startDate = moment().subtract(6, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
const endDate = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
detailY.value.createTime = [startDate, endDate]
search()
}
const handlePageSizeChange = (val: number) => {
getObj.value.pageSize = val
getObj.value.pageNum = 1
getInit({})
}
const handleCurrentChange = function (val) {
const handleCurrentChange = (val: number) => {
getObj.value.pageNum = val
getInit({})
}
const platformList = ref<string[]>([
// 'stripe',
// 'ios',
// 'FirstData',
// 'paymentasia',
// 'system',
// ''
])
const typeList = ref<string[]>([
'金币换金豆',
'金币换免费金豆',
'赠送金豆',
'购买金豆',
'客服操作'
])
//
//
const detailY = ref({
jwcode: '',
deptName: '',
orderNo: '',
payStyle: '',
type: '',
createTime: ''
createTime: [] as [string, string] | []
})
const getObj = ref({
pageNum: 1,
pageSize: 50
})
const exportExcel = function () {
dialogVisible.value = true
isExport.value = true
}
const exportConfirm = function () {
if (excelData.timegap == '1') {
excelData.startTime = moment().startOf('day').format('YYYY-MM-DD HH:mm:ss')
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
} else if (excelData.timegap == '3') {
excelData.startTime = moment()
.subtract(3, 'days')
.startOf('day')
.format('YYYY-MM-DD HH:mm:ss')
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
} else if (excelData.timegap == '7') {
excelData.startTime = moment()
.subtract(7, 'days')
.startOf('day')
.format('YYYY-MM-DD')
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
} else if (excelData.timegap == '30') {
excelData.startTime = moment()
.subtract(30, 'days')
.startOf('day')
.format('YYYY-MM-DD HH:mm:ss')
excelData.endTime = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss')
}
getInit(
{
sortField: '',
sortOrder: ''
},
(data) => {
console.log('导出数据', data)
//
data = data.map((item) => {
return {
姓名: item.name,
精网号: item.jwcode,
地区: item.deptName,
订单号: item.orderNo,
充值平台: item.payStyle,
金豆数量: item.count,
充值时间: moment(item.successTime).format('YYYY-MM-DD'),
金额: item.price
}
})
if (data.length == 0) {
ElMessage.error('没有数据')
isExport.value = false
dialogVisible.value = false
return
}
console.log('导出数据', data)
excelExport(data)
}
)
}
//excel
const excelExport = async function (data) {
const worksheet = utils.json_to_sheet(data)
const workbook = utils.book_new()
utils.book_append_sheet(workbook, worksheet, 'Sheet1')
const wbout = write(workbook, { bookType: 'xlsx', type: 'array' })
saveAs(
new Blob([wbout], { type: 'application/octet-stream' }),
'数据导出.xlsx'
)
isExport.value = false
dialogVisible.value = false
}
const ruleFormRef = ref<FormInstance>()
//
const getInit = async function (
//
const getInit = async (
{
sortField = '',
sortOrder = ''
}: {
sortField?: string
sortOrder?: string
},
callback?: Function
) {
}
) => {
try {
console.log('搜索参数', getObj.value)
const [startTime, endTime] = detailY.value.createTime
let startTime = ''
let endTime = ''
if (Array.isArray(detailY.value.createTime) && detailY.value.createTime.length === 2) {
[startTime, endTime] = detailY.value.createTime
}
console.log(startTime, endTime)
// POST
const result = await API({
url: '/dou/SearchPay',
data: {
pay: {
jwcode: isExport.value ? excelData.jwcode : detailY.value.jwcode,
deptName: isExport.value ? excelData.area : detailY.value.deptName,
startTime: isExport.value ? excelData.startTime : startTime || '',
endTime: isExport.value ? excelData.endTime : endTime || '',
payStyle: isExport.value ? '' : detailY.value.payStyle,
// type: isExport.value ? '' : detailY.value.type,
orderNo: isExport.value ? '' : detailY.value.orderNo,
jwcode: detailY.value.jwcode,
deptName: detailY.value.deptName,
startTime: startTime || '',
endTime: endTime || '',
payStyle: detailY.value.payStyle,
orderNo: detailY.value.orderNo,
sortField,
sortOrder
},
pageNum: isExport.value ? '' : getObj.value.pageNum,
pageSize: isExport.value ? '' : getObj.value.pageSize
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize
}
})
if (isExport.value) {
!!callback && callback(result.data)
} else {
tableData.value = result.data.list
total.value = result.data.total
}
} catch (error) {
console.log('请求失败', error)
//
}
}
// const handleSortChange = (column) => {
// const { prop, order } = column
// if (order === 'ascending') {
// getInit({ sortField: prop, sortOrder: 'ASC' })
// } else if (order === 'descending') {
// getInit({ sortField: prop, sortOrder: 'DESC' })
// }
// }
//
const trimJwCode = () => {
if (detailY.value.jwcode) {
detailY.value.jwcode = detailY.value.jwcode.replace(/\s/g, '')
}
if (detailY.value.orderNo) {
detailY.value.orderNo = detailY.value.orderNo.replace(/\s/g, '')
}
}
//
const search = function () {
const search = () => {
trimJwCode()
getObj.value.pageNum = 1
getInit({})
getCount()
}
//
const reset = function (formEl) {
const reset = (formEl: FormInstance) => {
formEl.resetFields()
}
//
//
const getPayPlatform = async () => {
try {
const result = await API({
@ -403,7 +339,8 @@ const getPayPlatform = async () => {
console.log('请求失败', error)
}
}
//
//
const getArea = async () => {
try {
const result = await API({
@ -414,33 +351,39 @@ const getArea = async () => {
console.log('请求失败', error)
}
}
//
//
const getPayType = async () => {
try {
const result = await API({
url: '/dou/getStyle'
})
platformList.value = result.data
// typeList.value = result.data
} catch (error) {
console.log('请求失败', error)
}
}
//
//
const getCount = async () => {
try {
let startTime = ''
let endTime = ''
if (Array.isArray(detailY.value.createTime) && detailY.value.createTime.length === 2) {
[startTime, endTime] = detailY.value.createTime
}
const result = await API({
url: '/dou/getRechargeTotal',
data: {
jwcode: detailY.value.jwcode,
deptName: detailY.value.deptName,
startTime: detailY.value.createTime[0],
endTime: detailY.value.createTime[1],
startTime: startTime || '',
endTime: endTime || '',
orderNo: detailY.value.orderNo,
payStyle: detailY.value.payStyle
}
})
if (!!result.data) {
if (result.data) {
console.log('合计数', result.data)
const { priceTotal, countTotal } = result.data
console.log('金豆总数', priceTotal, countTotal)
@ -454,12 +397,142 @@ const getCount = async () => {
console.log('请求失败', error)
}
}
getInit({})
getArea()
getPayType()
getCount()
getPayPlatform()
//
const showExportInfoPanel = ref(false)
const isExporting = ref(false)
const exportProgress = ref(0)
const totalExport = ref(0)
let allExportData: any[] = []
let cancelToken: any = null
//
const cancelExport = () => {
if (cancelToken) {
cancelToken.cancel('导出已取消')
}
isExporting.value = false
exportProgress.value = 0
allExportData = []
ElMessage.info('导出已取消')
}
// Excel
const doExportExcel = async () => {
try {
isExporting.value = true
exportProgress.value = 0
allExportData = []
let startTime = ''
let endTime = ''
if (Array.isArray(detailY.value.createTime) && detailY.value.createTime.length === 2) {
[startTime, endTime] = detailY.value.createTime
}
//
const totalResult = await API({
url: '/dou/SearchPay',
data: {
pay: {
jwcode: detailY.value.jwcode,
deptName: detailY.value.deptName,
startTime: startTime || '',
endTime: endTime || '',
payStyle: detailY.value.payStyle,
orderNo: detailY.value.orderNo
},
pageNum: 1,
pageSize: 1
}
})
totalExport.value = totalResult.data.total
if (totalExport.value === 0) {
ElMessage.error('没有数据可导出')
isExporting.value = false
showExportInfoPanel.value = false
return
}
const pageSize = 1000 // 100
const totalPages = Math.ceil(totalExport.value / pageSize)
for (let page = 1; page <= totalPages; page++) {
if (!isExporting.value) break //
const result = await API({
url: '/dou/SearchPay',
data: {
pay: {
jwcode: detailY.value.jwcode,
deptName: detailY.value.deptName,
startTime: startTime || '',
endTime: endTime || '',
payStyle: detailY.value.payStyle,
orderNo: detailY.value.orderNo
},
pageNum: page,
pageSize: pageSize
}
})
const data = result.data.list
allExportData = allExportData.concat(data)
const exportedCount = allExportData.length
exportProgress.value = Math.round((exportedCount / totalExport.value) * 100)
}
if (isExporting.value) {
//
const exportData = allExportData.map((item, index) => {
return {
序号: index + 1, //
姓名: item.name,
精网号: item.jwcode,
地区: item.deptName,
订单号: item.orderNo,
金豆数量: item.count,
金额: item.price,
充值平台: item.payStyle,
充值时间: !!item.successTime ? moment.unix(item.successTime).format('YYYY-MM-DD HH:mm:ss') : '-'
}
})
const worksheet = utils.json_to_sheet(exportData)
const workbook = utils.book_new()
utils.book_append_sheet(workbook, worksheet, 'Sheet1')
const wbout = write(workbook, { bookType: 'xlsx', type: 'array' })
saveAs(
new Blob([wbout], { type: 'application/octet-stream' }),
'线上充值明细导出.xlsx'
)
isExporting.value = false
showExportInfoPanel.value = false
ElMessage.success('导出成功')
}
} catch (error) {
if (error instanceof Error && error.message === '导出已取消') {
return
}
console.log('导出失败', error)
isExporting.value = false
showExportInfoPanel.value = false
ElMessage.error('导出失败,请稍后重试')
}
}
onMounted(() => {
getInit({})
getArea()
getPayType()
getCount()
getPayPlatform()
})
</script>
<style scoped lang="scss">
.filter-box {
width: 100%;
@ -492,3 +565,4 @@ getPayPlatform()
margin-top: 10px;
}
</style>

2
gold-system/src/views/index.vue

@ -1,4 +1,6 @@
<script setup>
//
// index
import { ref, onMounted, reactive, computed, watch } from 'vue'
import { useRouter } from 'vue-router'
import ElementPlus from 'element-plus'

10
gold-system/src/views/login.vue

@ -49,7 +49,7 @@ const login = async function () {
result.data.permission == '2' ||
result.data.permission == '3'
) {
router.push('/usergold')
router.push('/workspace')
} else if (result.data.permission == '4') {
router.push('/noPermission')
}
@ -66,6 +66,8 @@ const login = async function () {
//
}
}
</script>
<template>
<el-row class="login-page">
@ -79,14 +81,14 @@ const login = async function () {
<!-- <div style="height: 100vh; width: 1000px" class="container"></div> -->
<el-col :span="6" :offset="3" class="form">
<!-- 登录表单 -->
<el-form :model="form" size="large" autocomplete="off">
<el-form :model="form" size="large" autocomplete="off" >
<el-form-item>
<h1 style="color: #409eff">金币系统登录</h1>
</el-form-item>
<el-form-item prop="jwcode">
<el-input v-model="form.jwcode" placeholder="请输入精网号"></el-input>
<el-input v-model="form.jwcode" placeholder="请输入精网号" @keyup.enter="login"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-form-item prop="password" @keyup.enter="login">
<el-input
v-model="form.password"
type="password"

370
gold-system/src/views/managerecharge/activity.vue

@ -1,4 +1,5 @@
<script setup>
//
import { ref, onMounted, reactive, computed } from 'vue'
import ElementPlus from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
@ -25,7 +26,6 @@ const getAdminData = async function () {
}
}
//
//
const tableData = ref([])
//
@ -43,19 +43,10 @@ const getObj = ref({
const addObj = ref({
add: ''
})
//
//
const delObj = ref({})
// //
// const tableHeight = computed(function () {
// return (getObj.value.pageSize + 1) * 50 + "px";
// });
// ref
const Ref = ref(null)
//
//
//
const get = async function (val) {
try {
//
@ -63,26 +54,34 @@ const get = async function (val) {
getObj.value.pageNum = val
}
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
if (getTime.value.length === 2) {
activity.value.startDate = getTime.value[0]
activity.value.endDate = getTime.value[1]
}
} else {
activity.value.startDate = ''
activity.value.endDate = ''
activity.value.startDate = null
activity.value.endDate = null
}
console.log('搜索参数', getObj.value)
const requestData = {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
activity: {
...activity.value,
activityName: activity.value.activityName,
status: activity.value.status
}
};
console.log('搜索参数', requestData)
// POST
const result = await request({
url: '/recharge/activity/select',
data: {
...getObj.value,
activity: { ...activity.value }
}
method: 'post',
data: requestData
})
//
console.log('响应数据', result);
//
console.log('请求成功', result)
//
@ -93,227 +92,163 @@ const get = async function (val) {
console.log('total', total.value)
} catch (error) {
console.log('请求失败', error)
//
ElMessage.error('请求失败')
}
}
//
const getToday = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startDate, endDate]
console.log('getTime', getTime.value)
get()
}
//
const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
getTime.value = [startDate, endDate]
console.log('getTime', getTime.value)
get()
}
// 7
const get7Days = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startDate, endDate]
console.log('getTime', getTime.value)
get()
}
//
const trim = () => {
if (activity.value.activityName) {
activity.value.activityName = activity.value.activityName.replace(/\s/g, '');
}
}
//
const search = function () {
trim();
getObj.value.pageNum = 1
get()
}
//
const reset = function () {
getObj.value = {}
getObj.value.pageNum = 1
getObj.value.pageSize = 10
getTime.value = {}
getObj.value = {
pageNum: 1,
pageSize: 10
}
getTime.value = []
activity.value = {}
}
//
//
onMounted(async function () {
await getAdminData()
get()
})
// false
const addActivityVisible = ref(false)
//
const openAddActivityVisible = function () {
addActivityVisible.value = true
}
//
const closeAddActivityVisible = function (done) {
addActivityVisible.value = false
// addActivity
const addActivity = () => {
console.log('点击了新增活动按钮');
// addActivityVisible true
addActivityVisible.value = true;
};
//
const closeAddActivityVisible = () => {
addActivityVisible.value = false;
};
//
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
get()
}
//
const addActicity = function () {
console.log('Date', new Date())
//
addObj.value = {}
addObj.value.adminId = adminData.value.adminId
addObj.value.adminName = adminData.value.name
addObj.value.freeGold = '0'
addObj.value.rechargeRatio = 0
addObj.value.startTime = null
addObj.value.endTime = null
openAddActivityVisible()
//
const handleCurrentChange = function (val) {
getObj.value.pageNum = val
get()
}
//
const add = async function () {
Ref.value.validate(async (valid) => {
console.log('valid', valid)
if (valid) {
//
const throttledAdd = async () => {
try {
console.log('添加对象', addObj.value)
// POST
// 'add'
const { add, ...validData } = addObj.value;
// POST
const result = await request({
url: '/recharge/activity/add',
data: addObj.value
url: '/recharge/activity/add', //
method: 'post',
data: validData
})
//
console.log('请求成功', result)
//
get()
//
console.log('新增活动成功', result)
ElMessage.success('新增活动成功')
//
closeAddActivityVisible()
//
ElMessage({
type: 'success',
message: '活动添加成功!'
})
//
get()
} catch (error) {
console.log('请求失败', error)
//
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
console.log('新增活动失败', error)
ElMessage.error('新增活动失败')
}
})
}
// 使 _.throttle trailing false
const throttledAdd = _.throttle(add, 5000, { trailing: false })
//
// let onceFunction = true;
//
// const throttledAdd = (...args) => {
// if (onceFunction) {
// add.apply(null, args);
// onceFunction = false; // false
// timer = setTimeout(() => {
// onceFunction = true; //
// timer = null;
// }, 1000); // 10001
// }
// };
// =========================================================
//
const del = function (row) {
delObj.value.activityId = row.activityId
console.log('delObj', delObj.value)
}
//
const delConfirm = async function () {
//
const delConfirm = async (row) => {
try {
console.log('delObj', delObj.value)
// POST
delObj.value = row
//
const result = await request({
url: '/recharge/activity/edit',
url: '/recharge/activity/delete', //
method: 'post',
data: delObj.value
})
if (result.code == 200) {
ElMessage({
type: 'success',
message: '删除成功'
})
//
console.log('请求成功', result)
//
console.log('删除活动成功', result)
ElMessage.success('删除活动成功')
//
get()
} else {
ElMessage({
type: 'error',
message: '删除失败'
})
}
} catch (error) {
console.log('请求失败', error)
//
}
}
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
get()
}
const handleCurrentChange = function (val) {
getObj.value.pageNum = val
get()
}
//
//
const handleStartTimeChange = () => {
Ref.value.validateField('endTime')
}
const checkFreeGoldRadio = function (rule, value, callback) {
if (addObj.value.freeGold == 1) {
if (value == '0' || value == null || value == '') {
callback(new Error('请输入免费金币兑换比'))
} else if (value < 0 || isNaN(value)) {
callback(new Error('请输入正确的格式'))
} else {
callback()
}
} else {
callback()
console.log('删除活动失败', error)
ElMessage.error('删除活动失败')
}
}
const checkStartTime = function (rule, value, callback) {
if (value < new Date()) {
callback(new Error('开始时间不能小于当前时间'))
} else {
callback()
}
}
const checkEndTime = function (rule, value, callback) {
if (value < new Date()) {
callback(new Error('结束时间不能小于当前时间'))
} else if (value <= addObj.value.startTime) {
callback(new Error('结束时间不能小于开始时间'))
} else {
callback()
}
//
const del = (row) => {
delObj.value = row
}
const rules = reactive({
activityName: [
{ required: true, message: '请输入活动名称', trigger: 'blur' }
],
freeGold: [
{ required: true, message: '请选择是否赠送免费金币', trigger: 'blur' }
],
rechargeRatio: [{ validator: checkFreeGoldRadio, trigger: 'blur' }],
startTime: [
{ required: true, message: '请选择开始时间', trigger: 'blur' },
{ validator: checkStartTime, trigger: 'blur' }
],
endTime: [
{ required: true, message: '请选择结束时间', trigger: 'blur' },
{ validator: checkEndTime, trigger: 'blur' }
]
})
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize))
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
getObj.value.pageNum = parseInt(getObj.value.pageNum)
console.log('输入的数字合法')
get()
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
}
//
onMounted(async function () {
await getAdminData()
get()
})
</script>
<template>
@ -339,9 +274,14 @@ onMounted(async function () {
start-placeholder="起始时间"
end-placeholder="结束时间"
/>
<el-button style="margin-left: 10px" @click="getToday()"
></el-button
>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
</div>
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
</div>
</div>
@ -354,13 +294,13 @@ onMounted(async function () {
<div>
<el-button
plain
@click="addActicity()"
@click="addActivity()"
style="color: #048efb; border: 1px solid #048efb"
>新增活动</el-button
>
</div>
<div>
<el-table :data="tableData" :height="tableHeight" style="width: 100%">
<el-table :data="tableData" style="width: 100%">
<el-table-column
type="index"
label="序号"
@ -421,7 +361,7 @@ onMounted(async function () {
<template #default="scope">
<el-popconfirm
title="确定将此条活动删除吗?"
@confirm="delConfirm"
@confirm="delConfirm(delObj.value)"
>
<template #reference>
<el-button type="primary" text @click="del(scope.row)">
@ -445,7 +385,7 @@ onMounted(async function () {
<el-pagination
background
:page-size="getObj.pageSize"
:page-sizes="[5, 10, 20, 50, 100]"
:page-sizes="[5, 10, 20, 50]"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handlePageSizeChange"

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

@ -97,6 +97,62 @@ const get = async function (val) {
//
}
}
//
const getToday = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
// value1!!value1!!lhl
value1.value = [startDate, endDate];
console.log('value1', value1.value);
get();
}
//
const getYesterday = function () {
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const startDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
);
const endDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
);
// value1
value1.value = [startDate, endDate];
console.log('value1', value1.value);
get();
}
// 7
const get7Days = function () {
const today = new Date();
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
);
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
);
// value1
value1.value = [startDate, endDate];
console.log('value1', value1.value);
get();
}
//
const search = function () {
getObj.value.pageNum = 1
@ -464,6 +520,9 @@ function handleInput(value) {
:size="size"
value-format="YYYY-MM-DD"
/>
<el-button style="margin-left: 10px" @click="getToday"></el-button>
<el-button @click="getYesterday"></el-button>
<el-button @click="get7Days">近7天</el-button>
<!-- 按钮 -->
<el-button
class="button-item"
@ -474,6 +533,7 @@ function handleInput(value) {
>
<el-button
class="button-item"
type="success"
style="float: right"
@click="handledelete"
>重置</el-button

9
gold-system/src/views/permissions/index.vue

@ -62,8 +62,15 @@ const get = async function (val) {
console.log('请求失败', error)
}
}
//
const trimJwCode = () => {
if (admin.value.jwcode) {
admin.value.jwcode = admin.value.jwcode.replace(/\s/g, '');
}
}
//
const search = function () {
trimJwCode();
getObj.value.pageNum = 1
get()
}
@ -466,7 +473,7 @@ const handleCurrentChange = function (val) {
</div>
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
</div>
</div>

16
gold-system/src/views/recharge/addRecharge.vue

@ -9,7 +9,12 @@ import moment from 'moment'
import { range, re } from 'mathjs'
import { utils, read } from 'xlsx'
import throttle from 'lodash/throttle'
//
const trimJwCode = () => {
if (addRecharge.value.jwcode) {
addRecharge.value.jwcode = addRecharge.value.jwcode.replace(/\s/g, '');
}
}
//
const beforeAvatarUpload = (file) => {
const isJPG = file.type === 'image/jpeg'
@ -154,12 +159,14 @@ const rules = reactive({
//
const user = ref({})
const getUser = async function (jwcode) {
trimJwCode();
try {
// POST
const result = await API({
url: '/recharge/user',
data: {
jwcode: jwcode,
jwcode: addRecharge.value.jwcode,
area: adminData.value.area
}
})
@ -924,6 +931,7 @@ onMounted(async function () {
type="primary"
@click="getUser(addRecharge.jwcode)"
style="margin-left: 20px"
>查询</el-button
>
</el-form-item>
@ -1036,7 +1044,7 @@ onMounted(async function () {
placeholder="提交人姓名"
/>
</el-form-item>
<el-button @click="deleteRecharge" style="margin-left: 280px"
<el-button @click="deleteRecharge" style="margin-left: 280px" type="success"
>重置</el-button
>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
@ -1389,7 +1397,7 @@ onMounted(async function () {
@confirm="resetConfirm"
>
<template #reference>
<el-button type="primary" text @click="reset(scope.row)">
<el-button type="success" text @click="reset(scope.row)">
重置
</el-button>
</template>

2
gold-system/src/views/recharge/adminRecharge.vue

@ -517,7 +517,7 @@ const handleSortChange = (column) => {
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
</div>
</el-col>

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

@ -1,11 +1,16 @@
<script setup>
import { ref, onMounted, reactive, computed } from 'vue'
import { ref, onMounted, reactive, computed, nextTick } from 'vue'
import ElementPlus from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import { AiFillRead } from 'vue-icons-plus/ai'
import axios from 'axios'
import moment from 'moment'
import API from '@/util/http'
import * as XLSX from 'xlsx' // xlsx
// XLSX
const { utils, writeFile } = XLSX
//
//
const adminData = ref({})
@ -23,7 +28,14 @@ const getAdminData = async function () {
const tableData = ref([])
// ======================================
// rechargeVo
const rechargeVo = ref({})
const rechargeVo = ref({
activityId: '',
rechargeWay: '',
area: '',
startDate: '',
endDate: '',
status: ''
})
//
const getObj = ref({
pageNum: 1,
@ -57,14 +69,8 @@ const getPayWay = async function () {
}
}
// //
// const tableHeight = computed(function () {
// return (getObj.value.pageSize + 2) * 60 + "px";
// });
//
//
//
const trueGold = ref(0)
const trueRGold = ref(0)
const trueFGold = ref(0)
@ -100,7 +106,7 @@ const get = async function (val) {
}
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
if (getTime.value[0] && getTime.value[1]) {
rechargeVo.value.startDate = getTime.value[0]
rechargeVo.value.endDate = getTime.value[1]
}
@ -194,7 +200,7 @@ const reset = function () {
rechargeVo.value.endDate = ''
sortField.value = ''
sortOrder.value = ''
getTime.value = {}
getTime.value = []
}
//
const getToday = function () {
@ -314,7 +320,6 @@ const getActivity = async function () {
}
}
//
//
const getArea = async function () {
console.log('888888888880000000')
try {
@ -364,10 +369,10 @@ onMounted(async function () {
getAdminData()
get()
getActivity()
getPayWay()
getArea()
})
getArea()
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
get()
@ -397,6 +402,207 @@ const handleSortChange = (column) => {
sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
get()
}
// Excel
const headers = [
'序号',
'姓名',
'精网号',
'所属地区',
'活动名称',
'货币名称',
'充值金额',
'充值方式',
'永久金币',
'免费金币',
'备注',
'支付方式',
'提交人',
'状态',
'驳回理由',
'交款时间'
]
const showExportInfoPanel = ref(false)
//
const exportExcel = async () => {
try {
console.log('点击导出按钮,尝试显示信息面板');
showExportInfoPanel.value = true;
await nextTick(); //
} catch (error) {
console.error('显示信息面板失败:', error);
ElMessage.error('显示信息面板失败,请稍后重试');
}
};
//
const exportProgress = ref(0)
const isExporting = ref(false)
const exportCancelToken = ref(null)
// 使
// const platformMap = {
// 0: '',
// 1: 'ERP',
// 2: 'Homily Chart',
// 3: 'Homily Link',
// 4: ''
// };
// const updateTypeMap = {
// 0: '',
// 1: '',
// 2: '退',
// 3: ''
// };
//
const doExportExcel = async () => {
try {
isExporting.value = true
exportProgress.value = 0
showExportInfoPanel.value = false
// Excel
const wb = utils.book_new()
const ws = utils.aoa_to_sheet([headers])
utils.book_append_sheet(wb, ws, 'Sheet1')
//
const writer = {
write: (d, o) => {
if (!d) return
utils.sheet_add_aoa(ws, d, { origin: -1 })
}
}
let page = 1
let totalExported = 0
const pageSize = 5000 // 5000
let totalRecords = 0
//
const firstResult = await API({
url: '/recharge/recharge',
method: 'post',
data: {
pageNum: 1,
pageSize,
rechargeVo: { ...rechargeVo.value }
}
})
totalRecords = firstResult.data.total
//
const CancelToken = axios.CancelToken
exportCancelToken.value = CancelToken.source()
//
const firstData = firstResult.data.list
if (firstData.length) {
const rows = firstData.map((row, index) => [
totalExported + index + 1,
row.username || '',
row.jwcode || '',
row.area || '',
row.activityName || '',
// currencyName
row.currencyName || '',
(row.paidGold / 100).toFixed(2) || '0.00',
row.rechargeWay || '',
(row.paidGold / 100).toFixed(2) || '0.00',
(row.freeGold / 100).toFixed(2) || '0.00',
row.remark || '',
row.payWay || '',
row.name || '',
//
row.status === 1 ? '已通过' : row.status === 0 ? '待审核' : row.status === 2 ? '已驳回' : '',
row.reson || '',
moment(row.rechargeTime).format('YYYY-MM-DD HH:mm:ss') || ''
])
writer.write(rows)
totalExported += firstData.length
exportProgress.value = Math.round((totalExported / totalRecords) * 100)
page++
}
while (totalExported < totalRecords) {
const result = await API({
url: '/recharge/recharge',
method: 'post',
data: {
pageNum: page,
pageSize,
rechargeVo: { ...rechargeVo.value }
},
cancelToken: exportCancelToken.value.token
})
const data = result.data.list
if (!data.length) break
//
const rows = data.map((row, index) => [
totalExported + index + 1,
row.username || '',
row.jwcode || '',
row.area || '',
row.activityName || '',
// currencyName
row.currencyName || '',
(row.paidGold / 100).toFixed(2) || '0.00',
row.rechargeWay || '',
(row.paidGold / 100).toFixed(2) || '0.00',
(row.freeGold / 100).toFixed(2) || '0.00',
row.remark || '',
row.payWay || '',
row.name || '',
//
row.status === 1 ? '已通过' : row.status === 0 ? '待审核' : row.status === 2 ? '已驳回' : '',
row.reson || '',
moment(row.rechargeTime).format('YYYY-MM-DD HH:mm:ss') || ''
])
//
writer.write(rows)
totalExported += data.length
exportProgress.value = Math.round((totalExported / totalRecords) * 100)
// 500
if (page % 500 === 0) {
await new Promise(resolve => setTimeout(resolve, 0))
}
page++
}
//
writeFile(wb, '客户金币明细.xlsx')
ElMessage.success(`导出成功,共${totalExported}条数据`)
} catch (error) {
if (!axios.isCancel(error)) {
ElMessage.error(`导出失败: ${error.message}`)
}
} finally {
isExporting.value = false
exportCancelToken.value = null
}
}
//
const cancelExport = () => {
if (exportCancelToken.value) {
exportCancelToken.value.cancel('用户取消导出')
ElMessage.warning('导出已取消')
isExporting.value = false
}
}
const putExcel = ref({
startDate: new Date(),
endDate: new Date(new Date().setDate(new Date().getDate() + 1))
})
</script>
<template>
@ -463,7 +669,7 @@ const handleSortChange = (column) => {
</el-col>
</el-row>
<el-row>
<el-col :span="21">
<el-col :span="16">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker
@ -480,10 +686,12 @@ const handleSortChange = (column) => {
<el-button @click="get7Days()">近7天</el-button>
</div>
</el-col>
<el-col :span="3">
<el-col :span="6">
<div class="head-card-btn">
<el-button @click="reset()">重置</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>
</div>
</el-col>
</el-row>
@ -670,6 +878,53 @@ const handleSortChange = (column) => {
</el-card>
</el-col>
</el-row>
<!-- 导出excel提前展示的信息面板 -->
<el-dialog
v-model="showExportInfoPanel"
title="导出信息确认"
width="400px"
:close-on-click-modal="false"
>
<div class="info-panel-header">导出信息</div>
<div v-if="!rechargeVo.activityId && !rechargeVo.area && !rechargeVo.startDate && !rechargeVo.endDate">
你正在导出所有数据
</div>
<div v-else>
你正在导出以下数据
</div>
<div v-if="rechargeVo.activityId">活动名称{{ rechargeVo.activityId || '' }}</div>
<div v-if="rechargeVo.area">所属地区{{ rechargeVo.area || '' }}</div>
<div v-if="rechargeVo.startDate || rechargeVo.endDate">
<span>充值时间</span>
<span>{{ rechargeVo.startDate ? moment(rechargeVo.startDate).format('YYYY-MM-DD HH:mm:ss') : '无起始时间' }} {{ rechargeVo.endDate ? moment(rechargeVo.endDate).format('YYYY-MM-DD HH:mm:ss') : '无结束时间' }}</span>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="showExportInfoPanel = false">取消</el-button>
<el-button type="primary" @click="doExportExcel">导出</el-button>
</span>
</template>
</el-dialog>
<!-- 导出进度弹窗 -->
<el-dialog
v-model="isExporting"
title="正在导出"
width="400px"
:close-on-click-modal="false"
:show-close="false"
>
<el-progress
:percentage="exportProgress"
:format="(percentage) => `${percentage}%`"
/>
<template #footer>
<span class="dialog-footer">
<el-button type="danger" @click="cancelExport">取消导出</el-button>
</span>
</template>
</el-dialog>
</template>
<style scoped>

16
gold-system/src/views/refund/addRefund.vue

@ -25,7 +25,12 @@ const getAdminData = async function () {
console.log('请求失败', error)
}
}
//
const trimJwCode = () => {
if (addRefund.value.jwcode) {
addRefund.value.jwcode = addRefund.value.jwcode.replace(/\s/g, '');
}
}
// 退
const addRefund = ref({
updateType: '3',
@ -134,12 +139,13 @@ const user = ref({
firstRechargeTime: ''
})
const getUser = async function (jwcode) {
trimJwCode();
try {
// POST
const result = await API({
url: '/recharge/user',
data: {
jwcode: jwcode,
jwcode: addRefund.value.jwcode,
area: adminData.value.area
}
})
@ -188,14 +194,16 @@ const refundType = [
]
//
//
const goods = ref([])
const getGoods = async function (jwcode) {
trimJwCode();
try {
// POST
const result = await API({
url: '/consume/getDeatil',
data: {
jwcode: jwcode,
jwcode: addRefund.value.jwcode,
area: adminData.value.area
}
})
@ -388,7 +396,7 @@ onMounted(async function () {
placeholder="提交人姓名"
/>
</el-form-item>
<el-button @click="cancel()" style="margin-left: 280px">重置</el-button>
<el-button type="success" @click="cancel()" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交 </el-button>
</el-form>

2
gold-system/src/views/refund/allRefund.vue

@ -512,7 +512,7 @@ const handleCurrentChange = function (val) {
</el-col>
<el-col :span="3">
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
</div>
</el-col>

759
gold-system/src/views/usergold/index.vue

@ -1,14 +1,14 @@
<script setup>
import { ref, onMounted, reactive, computed } from 'vue'
import ElementPlus from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import { ref, onMounted, computed ,nextTick} from 'vue'
import { ElMessage } from 'element-plus'
import axios from 'axios'
import moment from 'moment'
import { ta } from 'element-plus/es/locales.mjs'
import API from '@/util/http'
import { writeFile, utils } from 'xlsx'
//
//
const adminData = ref({})
const getAdminData = async function () {
try {
@ -24,10 +24,34 @@ const getAdminData = async function () {
console.log('请求失败', error)
}
}
//
const isLoadingArea = ref(false);
const area = ref([])
const getArea = async () => {
isLoadingArea.value = true;
try {
const result = await API({
url: '/detailY/getarea'
});
// { value, label }
if (Array.isArray(result.data) && typeof result.data[0] === 'string') {
area.value = result.data.map(item => ({ value: item, label: item }));
} else {
area.value = result.data;
}
} catch (error) {
console.error('获取地区数据失败:', error);
ElMessage.error('获取地区数据失败,请稍后重试');
//
area.value = [];
} finally {
isLoadingArea.value = false;
}
};
//
const tableData = ref([])
//
// const tableAllData = ref([]);
//
const rechargeCoin = ref(0)
const freeCoin = ref(0)
@ -39,14 +63,12 @@ const total = ref(100)
const getTime = ref([])
// detailY
const detailY = ref({})
//
const getAllObj = ref({})
//
const getObj = ref({
pageNum: 1,
pageSize: 50
})
//excel
// excel
const getPutEX = ref(false)
//
@ -61,10 +83,6 @@ const num = [
}
]
// //
// const tableHeight = computed(function () {
// return (getObj.value.pageSize + 2) * 38 + "px";
// });
//
// ===========================================================================
@ -81,12 +99,9 @@ const get = async function (val) {
if (typeof val === 'number') {
getObj.value.pageNum = val
}
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
if (getTime.value.length === 2) {
detailY.value.startDate = getTime.value[0]
detailY.value.endDate = getTime.value[1]
}
} else {
detailY.value.startDate = ''
detailY.value.endDate = ''
@ -101,294 +116,281 @@ const get = async function (val) {
method: 'post',
data: { ...getObj.value, detailY: { ...detailY.value } }
})
// const result2 = await API.post("http://54.251.137.151:10702/detailY", {
// ...getAllObj.value,
// detailY: { ...detailY.value },
// });
//
console.log('请求成功', result)
// console.log("2", result2);
//
tableData.value = result.data.list
console.log('tableData', tableData.value)
// tableAllData.value = result2.data;
// console.log("tableAllData", tableAllData.value);
//
total.value = result.data.total
console.log('total', total.value)
// 100
// 100
// rechargeCoin.value = parseFloat((tableAllData.value.sumR / 100).toFixed(2));
// freeCoin.value = parseFloat((tableAllData.value.sumF / 100).toFixed(2));
// taskCoin.value = parseFloat((tableAllData.value.sumT / 100).toFixed(2));
// for (let i = 0; i < tableAllData.value.length; i++) {
// rechargeCoin.value += tableAllData.value[i].rechargeCoin;
// freeCoin.value += tableAllData.value[i].freeCoin;
// taskCoin.value += tableAllData.value[i].taskCoin;
// }
// console.log(
// "",
// rechargeCoin.value,
// freeCoin.value,
// taskCoin.value
// );
} catch (error) {
console.log('请求失败', error)
//
}
}
//
const search = function () {
getObj.value.pageNum = 1
get()
}
//
const reset = function () {
//
delete detailY.value.jwcode
//
delete detailY.value.num
//
delete detailY.value.startDate
//
delete detailY.value.endDate
//
delete detailY.value.area
delete sortField.value
delete sortOrder.value
getTime.value = {}
//
delete detailY.value.consumePlatform
// detailY jwcode
const trimJwCode = () => {
if (detailY.value.jwcode) {
detailY.value.jwcode = detailY.value.jwcode.replace(/\s/g, '');
}
}
//
const getToday = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const today = moment()
const startDate = today.startOf('day').toDate()
const endDate = today.endOf('day').toDate()
getTime.value = [startDate, endDate]
console.log('getTime', getTime.value)
get()
search()
}
//
const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
const yesterday = moment().subtract(1, 'day')
const startDate = yesterday.startOf('day').toDate()
const endDate = yesterday.endOf('day').toDate()
getTime.value = [startDate, endDate]
console.log('getTime', getTime.value)
get()
search()
}
// 7
const get7Days = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const startDate = moment().subtract(6, 'day').startOf('day').toDate()
const endDate = moment().endOf('day').toDate()
getTime.value = [startDate, endDate]
console.log('getTime', getTime.value)
search()
}
//
const search = function () {
trimJwCode();
getObj.value.pageNum = 1
get()
}
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize))
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
getObj.value.pageNum = parseInt(getObj.value.pageNum)
console.log('输入的数字合法')
get()
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
//
const reset = function () {
delete detailY.value.jwcode
delete detailY.value.num
delete detailY.value.startDate
delete detailY.value.endDate
delete detailY.value.area
delete sortField.value
delete sortOrder.value
getTime.value = []
delete detailY.value.consumePlatform
}
//
onMounted(async function () {
await getArea()
await getAdminData()
await get()
})
// excel
// Excel
//
const json_fields = (row) => {
return [
row.jwcode, //
row.area, //
row.platform, //
row.consumePlatform, //
row.gold, //
row.rechargeCoin, //
row.freeCoin, //
row.taskCoin, //
row.createAdmin, //
row.createTime,
row.name,
row.id
]
}
//
const json_meta = [
[
{
key: 'charset',
value: 'utf-8'
}
]
]
const headers = [
'序号',
'姓名',
'精网号',
'地区',
'所属地区',
'平台信息',
'数量',
'数量更新类型',
'更新数量',
'更新类型',
'永久金币',
'免费金币',
'任务金币',
'提交人',
'更新时间',
'用户名',
'id'
'更新时间'
]
const exportExcel = () => {
// json_fields
const data = excelInfo.value.map(json_fields)
const ws = utils.aoa_to_sheet(data)
//
utils.sheet_add_aoa(ws, [headers], { origin: 'A1' })
const showExportInfoPanel = ref(false)
//
const exportExcel = async () => {
try {
console.log('点击导出按钮,尝试显示信息面板');
showExportInfoPanel.value = true;
await nextTick();//
} catch (error) {
console.error('显示信息面板失败:', error);
ElMessage.error('显示信息面板失败,请稍后重试');
}
};
//
const exportProgress = ref(0)
const isExporting = ref(false)
const exportCancelToken = ref(null)
//
const doExportExcel = async () => {
try {
isExporting.value = true
exportProgress.value = 0
showExportInfoPanel.value = false
// Excel
const wb = utils.book_new()
const ws = utils.aoa_to_sheet([headers])
utils.book_append_sheet(wb, ws, 'Sheet1')
writeFile(wb, '客户金币明细.xlsx')
}
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const putExcel = ref({
startDate: startDate,
endDate: endDate
})
const excelInfo = ref({})
const loading = ref(false)
const areyour = async function () {
try {
loading.value = true
const result = await API({
url: '/detailY/searchAll',
method: 'post',
data: { ...putExcel.value }
})
excelInfo.value = result.data
// excelInfo
if (Array.isArray(excelInfo.value)) {
excelInfo.value.forEach((item) => {
if (item.rechargeCoin) {
item.rechargeCoin = item.rechargeCoin / 100
//
const writer = {
write: (d, o) => {
if (!d) return
utils.sheet_add_aoa(ws, d, { origin: -1 })
}
if (item.freeCoin) {
item.freeCoin = item.freeCoin / 100
}
if (item.taskCoin) {
item.taskCoin = item.taskCoin / 100
let page = 1
let totalExported = 0
const pageSize = 5000 // 5000
let totalRecords = 0
//
const firstResult = await API({
url: '/detailY',
method: 'post',
data: {
pageNum: 1,
pageSize,
detailY: { ...detailY.value }
}
})
totalRecords = firstResult.data.total
//
const CancelToken = axios.CancelToken
exportCancelToken.value = CancelToken.source()
//
const platformMap = {
0: '初始化金币',
1: 'ERP系统',
2: 'Homily Chart',
3: 'Homily Link',
4: '金币系统'
};
//
const updateTypeMap = {
0: '充值',
1: '消费',
2: '退款',
3: '其他'
};
//
const firstData = firstResult.data.list
if (firstData.length) {
const rows = firstData.map((row, index) => [
totalExported + index + 1,
row.username || '',
row.jwcode || '',
row.area || '',
platformMap[row.consumePlatform] || '',
(row.gold).toFixed(2) || '0.00',
updateTypeMap[row.updateType] || '',
(row.rechargeCoin / 100).toFixed(2) || '0.00',
(row.freeCoin / 100).toFixed(2) || '0.00',
(row.taskCoin / 100).toFixed(2) || '0.00',
row.name || '',
moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') || ''
])
writer.write(rows)
totalExported += firstData.length
exportProgress.value = Math.round((totalExported / totalRecords) * 100)
page++
}
areyouright.value = true
ElMessage({
type: 'success',
message: '查询成功'
while (totalExported < totalRecords) {
const result = await API({
url: '/detailY',
method: 'post',
data: {
pageNum: page,
pageSize,
detailY: { ...detailY.value }
},
cancelToken: exportCancelToken.value.token
})
loading.value = false
const data = result.data.list
if (!data.length) break
//
const rows = data.map((row, index) => [
totalExported + index + 1,
row.username || '',
row.jwcode || '',
row.area || '',
platformMap[row.consumePlatform] || '',
(row.gold / 100).toFixed(2) || '0.00',
updateTypeMap[row.updateType] || '',
(row.rechargeCoin / 100).toFixed(2) || '0.00',
(row.freeCoin / 100).toFixed(2) || '0.00',
(row.taskCoin / 100).toFixed(2) || '0.00',
row.name || '',
moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') || ''
])
//
writer.write(rows)
totalExported += data.length
exportProgress.value = Math.round((totalExported / totalRecords) * 100)
// 500
if (page % 500 === 0) {
await new Promise(resolve => setTimeout(resolve, 0))
}
page++
}
//
writeFile(wb, '客户金币明细.xlsx')
ElMessage.success(`导出成功,共${totalExported}条数据`)
} catch (error) {
console.log('请求失败', error)
loading.value = false
if (!axios.isCancel(error)) {
ElMessage.error(`导出失败: ${error.message}`)
}
} finally {
isExporting.value = false
exportCancelToken.value = null
}
}
const areyouright = ref(false)
//
const cancelExport = () => {
if (exportCancelToken.value) {
exportCancelToken.value.cancel('用户取消导出')
ElMessage.warning('导出已取消')
isExporting.value = false
}
}
//
const area = [
{
value: '马来西亚',
label: '马来西亚'
},
{
value: '新加坡',
label: '新加坡'
},
{
value: '香港',
label: '香港'
},
{
value: '泰国',
label: '泰国'
},
{
value: '加拿大',
label: '加拿大'
},
{
value: '越南HCM',
label: '越南HCM'
const putExcel = ref({
startDate: new Date(),
endDate: new Date(new Date().setDate(new Date().getDate() + 1))
})
//
const checkJwCode = async (jwcode) => {
try {
const result = await API({
url: '/recharge/user',
method: 'post',
data: {
jwcode,
area: adminData.value.area
}
]
//
})
// code
return result.code !== 0
} catch (error) {
console.log('校验精网号失败', error)
return false
}
}
//
const platform = [
{
value: '4',
label: '金币系统'
},
{
value: '1',
label: 'ERP系统'
@ -406,84 +408,12 @@ const platform = [
label: '初始化金币'
}
]
const TimeGet = ref('1')
//
const getT = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
putExcel.value.startDate = startDate
putExcel.value.endDate = endDate
console.log('putExcel', putExcel.value)
}
//3
const get3 = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 2
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
putExcel.value.startDate = startDate
putExcel.value.endDate = endDate
console.log('putExcel', putExcel.value)
}
// 7
const get7 = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
putExcel.value.startDate = startDate
putExcel.value.endDate = endDate
console.log('putExcel', putExcel.value)
}
// 30
const get30 = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth() - 1,
today.getDate()
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
putExcel.value.startDate = startDate
putExcel.value.endDate = endDate
console.log('putExcel', putExcel.value)
}
//
const sortField = ref('')
const sortOrder = ref('')
//
const handleSortChange = (column) => {
console.log('排序字段:', column.prop)
console.log('排序方式:', column.order)
if (column.prop === 'rechargeCoin') {
sortField.value = 'recharge_coin'
} else if (column.prop === 'taskCoin') {
@ -497,11 +427,14 @@ const handleSortChange = (column) => {
}
sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
}
get()
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
get()
}
const handleCurrentChange = function (val) {
getObj.value.pageNum = val
get()
@ -509,73 +442,64 @@ const handleCurrentChange = function (val) {
</script>
<template>
<!-- 导出excel提前展示的信息面板 -->
<el-dialog
v-model="areyouright"
title=""
width="500"
v-model="showExportInfoPanel"
title="导出信息确认"
width="400px"
:close-on-click-modal="false"
>
<el-button type="success" @click="exportExcel()">导出</el-button>
<div class="info-panel-header">导出信息</div>
<!-- 直接使用 detailY 显示信息添加可选链操作符 -->
<!-- detailY是一个ref所以在模板中应该直接使用detailY.consumePlatform
而不是detailY.value.consumePlatform
因为在模板中ref变量会自动解包不需要.value
例如在代码中我们可能错误地在模板中使用了detailY.value但实际上应该直接使用detailY -->
<div v-if="!detailY.jwcode && !detailY.consumePlatform && !detailY.num && !detailY.area && (getTime.length < 2)">
你正在导出所有数据
</div>
<div v-else>
你正在导出以下数据
</div>
<div v-if="detailY.jwcode">精网号{{ detailY.jwcode || '' }}</div>
<div v-if="detailY.consumePlatform">平台信息{{ detailY.consumePlatform ? (platform.find(item => item.value === detailY.consumePlatform)?.label) : '' }}</div>
<div v-if="detailY.num">数量更新类型{{ detailY.num ? (num.find(item => item.value === detailY.num)?.label || '') : '' }}</div>
<div v-if="detailY.area">所属地区{{ detailY.area || '' }}</div>
<div v-if="Array.isArray(getTime) && getTime.length >= 2">
<span>更新时间</span>
<!-- 直接使用 getTime 而非 getTime.value -->
<span v-if="Array.isArray(getTime) && getTime.length >= 2">
{{ moment(getTime[0]).format('YYYY-MM-DD') }} {{ moment(getTime[1]).format('YYYY-MM-DD') }}
</span>
<span v-else></span>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="showExportInfoPanel = false">取消</el-button>
<el-button type="primary" @click="doExportExcel">导出</el-button>
</span>
</template>
</el-dialog>
<!-- 这是导出excel的弹窗 -->
<!-- 导出进度弹窗 -->
<el-dialog
v-model="getPutEX"
title="请选择导出条件"
width="500"
v-model="isExporting"
title="正在导出"
width="400px"
:close-on-click-modal="false"
:show-close="false"
>
<template #footer>
<el-form
v-loading="loading"
ref="ruleFormRef"
style="max-width: 600px"
:model="putExcel"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form-item prop="activityName" label="精网号:">
<el-input
v-model="putExcel.jwcode"
placeholder="请输入精网号"
style="width: 220px"
/>
</el-form-item>
<el-form-item label="所属地区:"
><el-select
v-model="putExcel.area"
placeholder="请选择所属地区"
style="width: 240px"
clearable
>
<el-option
v-for="item in area"
:key="item.value"
:label="item.label"
:value="item.value"
<el-progress
:percentage="exportProgress"
:stroke-width="15"
striped
animated
/>
</el-select>
</el-form-item>
<el-form-item label="更新时间:">
<el-radio-group v-model="TimeGet">
<el-radio value="1" @click="getT()">今天</el-radio>
<el-radio value="3" @click="get3()">近三天</el-radio>
<el-radio value="7" @click="get7()">近一周</el-radio>
<el-radio value="30" @click="get30()">近一个月</el-radio>
</el-radio-group>
</el-form-item>
<el-button
type="primary"
size="small"
style="margin-left: 10px"
@click="areyour()"
>确定</el-button
>
</el-form>
<div class="export-status">
已导出 {{ Math.round((exportProgress / 100) * total) }} / {{ total }}
</div>
<template #footer>
<el-button type="danger" @click="cancelExport">取消导出</el-button>
</template>
</el-dialog>
@ -636,14 +560,15 @@ const handleCurrentChange = function (val) {
<el-select
v-model="detailY.area"
placeholder="请选择所属地区"
style="width: 200px"
style="width: 240px"
clearable
:loading="isLoadingArea"
>
<el-option
v-for="item in area"
:key="item.value"
:label="item.label"
:value="item.value"
:key="item.value || item"
:label="item.label || item"
:value="item.value || item"
/>
</el-select>
</div>
@ -658,12 +583,13 @@ const handleCurrentChange = function (val) {
range-separator="至"
start-placeholder="起始时间"
end-placeholder="结束时间"
style="margin-right: 700px"
style="margin-right: 50px"
/>
<el-button type="success" @click="getPutEX = true"
>导出Excel表格</el-button
>
<el-button @click="reset()">重置</el-button>
<el-button @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
<el-button type="success" @click="exportExcel">导出Excel表格</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
</div>
</el-card>
@ -672,12 +598,6 @@ const handleCurrentChange = function (val) {
<el-row>
<el-col>
<el-card>
<!-- <div>
现有金币永久金币{{ Math.abs(rechargeCoin) }}免费金币{{
Math.abs(freeCoin)
}}任务金币{{ Math.abs(taskCoin) }}
</div> -->
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 584px; overflow-y: auto">
<el-table
:data="tableData"
@ -728,7 +648,7 @@ const handleCurrentChange = function (val) {
prop="gold"
label="更新数量"
width="120"
sortable="custom"
sortable="custom"
>
<template #default="scope">
<span>{{ scope.row.gold / 100 }}</span>
@ -737,23 +657,15 @@ const handleCurrentChange = function (val) {
<el-table-column prop="updateType" label="更新类型" width="110">
<!-- 模板内容 -->
<template #default="scope">
<span v-if="scope.row.updateType == 1">
<span>消费</span>
</span>
<span v-if="scope.row.updateType == 0">
<span>充值</span>
</span>
<span v-if="scope.row.updateType == 2">
<span>退款</span>
</span>
<span v-if="scope.row.updateType == 3">
<span>其他</span>
</span>
<span v-if="scope.row.updateType == 1">消费</span>
<span v-if="scope.row.updateType == 0">充值</span>
<span v-if="scope.row.updateType == 2">退款</span>
<span v-if="scope.row.updateType == 3">其他</span>
</template>
</el-table-column>
<el-table-column
prop="rechargeCoin"
sortable="custom"
sortable="custom"
label="永久金币"
width="110"
>
@ -763,7 +675,7 @@ const handleCurrentChange = function (val) {
</el-table-column>
<el-table-column
prop="freeCoin"
sortable="custom"
sortable="custom"
label="免费金币"
width="110"
>
@ -771,10 +683,9 @@ const handleCurrentChange = function (val) {
<span>{{ scope.row.freeCoin / 100 }}</span>
</template>
</el-table-column>
<el-table-column
prop="taskCoin"
sortable="custom"
sortable="custom"
label="任务金币"
width="110"
>
@ -785,7 +696,7 @@ const handleCurrentChange = function (val) {
<el-table-column prop="name" label="提交人" width="110" />
<el-table-column
prop="createTime"
sortable="custom"
sortable="custom"
label="更新时间"
width="210"
show-overflow-tooltip
@ -799,8 +710,7 @@ const handleCurrentChange = function (val) {
</el-table>
</div>
<!-- 分页 -->
<!-- 分页 -->
<!-- 此处分页 -->
<div class="pagination" style="margin-top: 20px">
<el-pagination
background
@ -830,11 +740,24 @@ const handleCurrentChange = function (val) {
display: flex;
}
/* .head-card-element {
margin-right: 20px;
} */
.info-panel-header {
font-weight: bold;
margin-bottom: 10px;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
}
.export-status {
margin-top: 15px;
text-align: center;
color: #666;
}
.el-progress-bar__inner {
transition: width 0.5s ease;
}
/* .head-card-btn {
margin-left: auto;
} */
</style>

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

@ -1,4 +1,5 @@
<script setup>
//
import { ref, onMounted, reactive, computed } from 'vue'
import ElementPlus from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
@ -136,8 +137,16 @@ const get = async function (val) {
//
}
}
// detailY putExcel jwcode
const trimJwCode = () => {
if (detailY.value.jwcode) {
detailY.value.jwcode = detailY.value.jwcode.replace(/\s/g, '');
}
}
//
const search = function () {
trimJwCode();
getObj.value.pageNum = 1
get()
}
@ -278,7 +287,7 @@ const handleCurrentChange = function (val) {
</div>
<div class="head-card-btn">
<el-button @click="reset()">重置</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
</div>
</div>

2
gold-system/src/views/workspace/index.vue

@ -1,6 +1,6 @@
<script setup>
import * as echarts from 'echarts'
//
import { ref, onMounted, reactive, computed } from 'vue'
import { VscInfo } from 'vue-icons-plus/vsc'
import * as bs from 'vue-icons-plus/bs'

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

Loading…
Cancel
Save