金币系统前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

693 lines
20 KiB

1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
  1. <script setup>
  2. import { ref, onMounted, reactive, computed } from 'vue'
  3. import ElementPlus from 'element-plus'
  4. import { ElMessage, ElMessageBox } from 'element-plus'
  5. import { AiFillRead } from 'vue-icons-plus/ai'
  6. import axios from 'axios'
  7. import moment from 'moment'
  8. import API from '@/util/http'
  9. // 变量
  10. //这是获取用户信息的接口
  11. const adminData = ref({})
  12. const getAdminData = async function () {
  13. try {
  14. const result = await API({ url: '/admin/userinfo', data: {} })
  15. adminData.value = result
  16. console.log('请求成功', result)
  17. console.log('用户信息', adminData.value)
  18. } catch (error) {
  19. console.log('请求失败', error)
  20. }
  21. }
  22. // 充值明细表格
  23. const tableData = ref([])
  24. // 搜索======================================
  25. // 搜索rechargeVo
  26. const rechargeVo = ref({})
  27. // 搜索对象
  28. const getObj = ref({
  29. pageNum: 1,
  30. pageSize: 50
  31. })
  32. //分页总条目
  33. const total = ref(100)
  34. // 搜索对象时间
  35. const getTime = ref([])
  36. // 搜索活动列表
  37. const activity = ref([])
  38. // 所有信息
  39. const allData = ref([])
  40. // 搜索地区列表
  41. const area = ref([])
  42. //标签页默认高亮选项
  43. const activeName = ref('all')
  44. // 充值方式选项
  45. const rechargeWay = ref([])
  46. // 获取充值方式的数据的接口
  47. const getPayWay = async function () {
  48. try {
  49. const result = await API({ url: '/recharge/recharge/getWay', data: {} })
  50. rechargeWay.value = result.data.filter((item) => item)
  51. console.log('请求成功', result)
  52. console.log('充值方式', rechargeWay.value)
  53. } catch (error) {
  54. console.log('请求失败', error)
  55. }
  56. }
  57. // //表格高度
  58. // const tableHeight = computed(function () {
  59. // return (getObj.value.pageSize + 2) * 60 + "px";
  60. // });
  61. // 方法
  62. // 合计数存储
  63. // 合计数存储
  64. const trueGold = ref(0)
  65. const trueRGold = ref(0)
  66. const trueFGold = ref(0)
  67. //全部
  68. const totalmoney = ref(0)
  69. const totalRcoin = ref(0)
  70. const totalFcoin = ref(0)
  71. //待审核
  72. const pendingGold = ref(0)
  73. const pendingRGold = ref(0)
  74. const pendingFGold = ref(0)
  75. // 已通过金币数
  76. const approvedGold = ref(0)
  77. const approvedRGold = ref(0)
  78. const approvedFGold = ref(0)
  79. // 已驳回金币数
  80. const rejectedGold = ref(0)
  81. const rejectedRGold = ref(0)
  82. const rejectedFGold = ref(0)
  83. // 搜索==============================================================
  84. // 搜索方法
  85. const get = async function (val) {
  86. try {
  87. // 地区赋值
  88. if (adminData.value.area === '泰国') {
  89. rechargeVo.value.areas = ['泰国', '越南']
  90. } else if (adminData.value.area !== '总部') {
  91. rechargeVo.value.area = adminData.value.area
  92. }
  93. // 搜索参数页码赋值
  94. if (typeof val === 'number') {
  95. getObj.value.pageNum = val
  96. }
  97. // 搜索参数时间赋值
  98. if (getTime.value != null) {
  99. if (getTime.value.startDate != '' && getTime.value.endDate != '') {
  100. rechargeVo.value.startDate = getTime.value[0]
  101. rechargeVo.value.endDate = getTime.value[1]
  102. }
  103. } else {
  104. rechargeVo.value.startDate = ''
  105. rechargeVo.value.endDate = ''
  106. }
  107. // 搜索参数赋值
  108. rechargeVo.value.sortField = sortField.value
  109. rechargeVo.value.sortOrder = sortOrder.value
  110. console.log('搜索参数', getObj.value)
  111. // 发送POST请求
  112. const result = await API({
  113. url: '/recharge/recharge',
  114. data: { ...getObj.value, rechargeVo: { ...rechargeVo.value } }
  115. })
  116. // 复制一份 rechargeVo.value 并移除排序字段和排序方式
  117. const detailWithoutSort = ref({
  118. area: rechargeVo.value.area,
  119. adminId: rechargeVo.value.adminId,
  120. startDate: rechargeVo.value.startDate,
  121. endDate: rechargeVo.value.endDate
  122. })
  123. const result2 = await API({
  124. url: '/recharge/recharge/RechargeA',
  125. data: {
  126. ...detailWithoutSort.value
  127. }
  128. })
  129. // 检查 result2 是否为空
  130. if (!result2 || !result2.data || result2.data.length === 0) {
  131. totalmoney.value = 0
  132. totalRcoin.value = 0
  133. totalFcoin.value = 0
  134. }
  135. if (result2.data) {
  136. result2.data.forEach((item) => {
  137. switch (item.auditStatus) {
  138. case '待审核':
  139. // 若 item.raudit 为空则赋值为 0
  140. // 若 item.sumRaudit 为空则赋值为 0
  141. pendingGold.value = item.sumRaudit || 0
  142. pendingRGold.value = item.sumRaudit1 || 0
  143. pendingFGold.value = item.sumRaudit2 || 0
  144. break
  145. case '已通过':
  146. approvedGold.value = item.sumRaudit || 0
  147. approvedRGold.value = item.sumRaudit1 || 0
  148. approvedFGold.value = item.sumRaudit2 || 0
  149. break
  150. case '已驳回':
  151. rejectedGold.value = item.sumRaudit || 0
  152. rejectedRGold.value = item.sumRaudit1 || 0
  153. rejectedFGold.value = item.sumRaudit2 || 0
  154. break
  155. }
  156. })
  157. }
  158. trueGold.value = pendingGold.value + approvedGold.value + rejectedGold.value
  159. trueRGold.value =
  160. pendingRGold.value + approvedRGold.value + rejectedRGold.value
  161. trueFGold.value =
  162. pendingFGold.value + approvedFGold.value + rejectedFGold.value
  163. // 将响应结果存储到响应式数据中
  164. console.log('请求成功', result)
  165. // 存储表格数据
  166. tableData.value = result.data.list
  167. console.log('tableData', tableData.value)
  168. // 存储分页总数
  169. total.value = result.data.total
  170. console.log('total', total.value)
  171. } catch (error) {
  172. console.log('请求失败', error)
  173. // 在这里可以处理错误逻辑,比如显示错误提示等
  174. }
  175. }
  176. // 搜索
  177. const search = function () {
  178. getObj.value.pageNum = 1
  179. get()
  180. }
  181. // 重置
  182. const reset = function () {
  183. rechargeVo.value.activityId = ''
  184. rechargeVo.value.rechargeWay = ''
  185. rechargeVo.value.area = ''
  186. rechargeVo.value.startDate = ''
  187. rechargeVo.value.endDate = ''
  188. sortField.value = ''
  189. sortOrder.value = ''
  190. getTime.value = {}
  191. }
  192. // 今天
  193. const getToday = function () {
  194. const today = new Date()
  195. const startDate = new Date(
  196. today.getFullYear(),
  197. today.getMonth(),
  198. today.getDate()
  199. )
  200. const endDate = new Date(
  201. today.getFullYear(),
  202. today.getMonth(),
  203. today.getDate() + 1
  204. )
  205. getTime.value = [startDate, endDate]
  206. console.log('getTime', getTime.value)
  207. get()
  208. }
  209. // 昨天
  210. const getYesterday = function () {
  211. const yesterday = new Date()
  212. yesterday.setDate(yesterday.getDate() - 1)
  213. const startDate = new Date(
  214. yesterday.getFullYear(),
  215. yesterday.getMonth(),
  216. yesterday.getDate()
  217. )
  218. const endDate = new Date(
  219. yesterday.getFullYear(),
  220. yesterday.getMonth(),
  221. yesterday.getDate() + 1
  222. )
  223. getTime.value = [startDate, endDate]
  224. console.log('getTime', getTime.value)
  225. get()
  226. }
  227. // 近7天
  228. const get7Days = function () {
  229. const today = new Date()
  230. const startDate = new Date(
  231. today.getFullYear(),
  232. today.getMonth(),
  233. today.getDate() - 6
  234. )
  235. const endDate = new Date(
  236. today.getFullYear(),
  237. today.getMonth(),
  238. today.getDate() + 1
  239. )
  240. getTime.value = [startDate, endDate]
  241. console.log('getTime', getTime.value)
  242. get()
  243. }
  244. //全部充值明细
  245. const adminAll = function () {
  246. console.log('adminAll')
  247. rechargeVo.value.status = ''
  248. getObj.value.pageNum = 1
  249. get()
  250. }
  251. //待审核充值明细
  252. const adminWait = async function () {
  253. rechargeVo.value.status = 0
  254. getObj.value.pageNum = 1
  255. await get()
  256. console.log('adminWait')
  257. trueGold.value = pendingGold.value
  258. trueRGold.value = pendingRGold.value
  259. trueFGold.value = pendingFGold.value
  260. }
  261. //已通过充值明细
  262. const adminPass = async function () {
  263. rechargeVo.value.status = 1
  264. getObj.value.pageNum = 1
  265. await get()
  266. console.log('adminPass')
  267. trueGold.value = approvedGold.value
  268. trueRGold.value = approvedRGold.value
  269. trueFGold.value = approvedFGold.value
  270. }
  271. //已驳回充值明细
  272. const adminReject = async function () {
  273. rechargeVo.value.status = 2
  274. getObj.value.pageNum = 1
  275. await get()
  276. trueGold.value = rejectedGold.value
  277. trueRGold.value = rejectedRGold.value
  278. trueFGold.value = rejectedFGold.value
  279. console.log('adminReject')
  280. }
  281. //点击标签页
  282. const handleClick = function (tab, event) {
  283. if (tab.props.name === 'all') {
  284. adminAll()
  285. } else if (tab.props.name === 'wait') {
  286. adminWait()
  287. } else if (tab.props.name === 'pass') {
  288. adminPass()
  289. } else if (tab.props.name === 'reject') {
  290. adminReject()
  291. }
  292. }
  293. // 获取活动名称
  294. const getActivity = async function () {
  295. try {
  296. // 发送POST请求
  297. const result = await API({ url: '/recharge/activity/select', data: {} })
  298. // 将响应结果存储到响应式数据中
  299. console.log('请求成功', result)
  300. // 存储表格数据
  301. activity.value = result.data
  302. console.log('activity', activity.value)
  303. } catch (error) {
  304. console.log('请求失败', error)
  305. // 在这里可以处理错误逻辑,比如显示错误提示等
  306. }
  307. }
  308. // 获取地区
  309. // 获取地区
  310. const getArea = async function () {
  311. try {
  312. // 发送POST请求
  313. const result = await API.post({ url: '/recharge/user/search', data: {} })
  314. // 将响应结果存储到响应式数据中
  315. console.log('请求成功', result)
  316. // 存储地区信息
  317. area.value = result.data
  318. console.log('地区', area.value)
  319. } catch (error) {
  320. console.log('请求失败', error)
  321. // 在这里可以处理错误逻辑,比如显示错误提示等
  322. }
  323. }
  324. // 验证跳转输入框的数字是否合法
  325. const checkNumber = function () {
  326. if (typeof parseInt(getObj.value.pageNum) === 'number') {
  327. console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize))
  328. if (
  329. getObj.value.pageNum > 0 &&
  330. getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
  331. ) {
  332. getObj.value.pageNum = parseInt(getObj.value.pageNum)
  333. console.log('输入的数字合法')
  334. get()
  335. } else {
  336. //提示
  337. ElMessage({
  338. type: 'error',
  339. message: '请检查输入内容'
  340. })
  341. }
  342. } else {
  343. //提示
  344. ElMessage({
  345. type: 'error',
  346. message: '请检查输入内容'
  347. })
  348. }
  349. }
  350. // 挂载
  351. onMounted(async function () {
  352. await getAdminData()
  353. await get()
  354. await getActivity()
  355. await getArea()
  356. await getPayWay()
  357. })
  358. const handlePageSizeChange = function (val) {
  359. getObj.value.pageSize = val
  360. get()
  361. }
  362. const handleCurrentChange = function (val) {
  363. getObj.value.pageNum = val
  364. get()
  365. }
  366. // 新增排序字段和排序方式
  367. const sortField = ref('')
  368. const sortOrder = ref('')
  369. // 处理排序事件
  370. const handleSortChange = (column) => {
  371. console.log('排序字段:', column.prop)
  372. console.log('排序方式:', column.order)
  373. if (column.prop === 'paidGold') {
  374. sortField.value = 'recharge_gold'
  375. } else if (column.prop === 'freeGold') {
  376. sortField.value = 'free_gold'
  377. } else if (column.prop === 'rechargeTime') {
  378. sortField.value = 'recharge_time'
  379. } else if (column.prop === 'createTime') {
  380. sortField.value = 'create_time'
  381. } else if (column.prop === 'paidMoney') {
  382. sortField.value = 'paid_gold'
  383. }
  384. sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
  385. get()
  386. }
  387. </script>
  388. <template>
  389. <el-row>
  390. <el-col>
  391. <el-card style="margin-bottom: 20px">
  392. <el-row style="margin-bottom: 10px">
  393. <el-col :span="8">
  394. <div class="head-card-element">
  395. <el-text class="mx-1" size="large">活动名称</el-text>
  396. <el-select
  397. v-model="rechargeVo.activityId"
  398. placeholder="请选择活动名称"
  399. size="large"
  400. style="width: 240px"
  401. clearable
  402. >
  403. <el-option
  404. v-for="item in activity"
  405. :key="item.activityId"
  406. :label="item.activityName"
  407. :value="item.activityId"
  408. />
  409. </el-select>
  410. </div>
  411. </el-col>
  412. <el-col :span="8">
  413. <!-- <div class="head-card-element">
  414. <el-text class="mx-1" size="large">充值方式</el-text>
  415. <el-select
  416. v-model="rechargeVo.rechargeWay"
  417. placeholder="请选择充值方式"
  418. size="large"
  419. style="width: 240px"
  420. clearable
  421. >
  422. <el-option
  423. v-for="item in rechargeWay"
  424. :key="item"
  425. :label="item"
  426. :value="item"
  427. />
  428. </el-select>
  429. </div> -->
  430. </el-col>
  431. <el-col :span="8">
  432. <div class="head-card-element" v-if="adminData.area == '总部'">
  433. <el-text class="mx-1" size="large">所属地区</el-text>
  434. <el-select
  435. v-model="rechargeVo.area"
  436. placeholder="请选择所属地区"
  437. size="large"
  438. style="width: 240px"
  439. clearable
  440. >
  441. <el-option
  442. v-for="item in area"
  443. :key="item"
  444. :label="item"
  445. :value="item"
  446. />
  447. </el-select>
  448. </div>
  449. </el-col>
  450. </el-row>
  451. <el-row>
  452. <el-col :span="21">
  453. <div class="head-card-element">
  454. <el-text class="mx-1" size="large">充值时间</el-text>
  455. <el-date-picker
  456. v-model="getTime"
  457. type="datetimerange"
  458. range-separator="至"
  459. start-placeholder="起始时间"
  460. end-placeholder="结束时间"
  461. />
  462. <el-button style="margin-left: 10px" @click="getToday()"
  463. ></el-button
  464. >
  465. <el-button @click="getYesterday()"></el-button>
  466. <el-button @click="get7Days()">近7天</el-button>
  467. </div>
  468. </el-col>
  469. <el-col :span="3">
  470. <div class="head-card-btn">
  471. <el-button @click="reset()">重置</el-button>
  472. <el-button type="primary" @click="search()">查询</el-button>
  473. </div>
  474. </el-col>
  475. </el-row>
  476. </el-card>
  477. </el-col>
  478. </el-row>
  479. <el-row>
  480. <el-col>
  481. <el-card>
  482. <el-tabs
  483. v-model="activeName"
  484. type="card"
  485. class="demo-tabs"
  486. @tab-click="handleClick"
  487. >
  488. <el-tab-pane label="全部" name="all"></el-tab-pane>
  489. <el-tab-pane label="待审核" name="wait"></el-tab-pane>
  490. <el-tab-pane label="已通过" name="pass"></el-tab-pane>
  491. <el-tab-pane label="已驳回" name="reject"></el-tab-pane>
  492. <div>
  493. 充值金额{{ trueRGold / 100 }}新币永久金币{{
  494. trueRGold / 100
  495. }}金币免费金币{{ totalFcoin / 100 }}金币
  496. </div>
  497. </el-tabs>
  498. <!-- 设置表格容器的高度和滚动样式 -->
  499. <div style="height: 520px; overflow-y: auto">
  500. <el-table
  501. :data="tableData"
  502. style="width: 100%"
  503. height="520px"
  504. @sort-change="handleSortChange"
  505. >
  506. <el-table-column
  507. type="index"
  508. label="序号"
  509. width="70px"
  510. fixed="left"
  511. >
  512. <template #default="scope">
  513. <span>{{
  514. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  515. }}</span>
  516. </template>
  517. </el-table-column>
  518. <el-table-column
  519. fixed="left"
  520. prop="username"
  521. label="姓名"
  522. width="100px"
  523. />
  524. <el-table-column
  525. fixed="left"
  526. prop="jwcode"
  527. label="精网号"
  528. width="110px"
  529. />
  530. <el-table-column prop="area" label="所属地区" width="100px" />
  531. <el-table-column
  532. prop="activityName"
  533. label="活动名称"
  534. width="150px"
  535. />
  536. <el-table-column prop="" label="货币名称" width="120px" />
  537. <el-table-column
  538. prop="paidMoney"
  539. label="充值金额"
  540. width="120px"
  541. sortable=" custom"
  542. >
  543. <template #default="scope">
  544. <span>{{ scope.row.paidGold / 100 }}</span>
  545. </template>
  546. </el-table-column>
  547. <el-table-column
  548. prop="rechargeWay"
  549. label="充值方式"
  550. width="100px"
  551. />
  552. <el-table-column
  553. prop="paidGold"
  554. label="永久金币"
  555. sortable="“custom”"
  556. width="110px"
  557. >
  558. <template #default="scope">
  559. <span>{{ scope.row.paidGold / 100 }}</span>
  560. </template>
  561. </el-table-column>
  562. <el-table-column
  563. prop="freeGold"
  564. label="免费金币"
  565. sortable="“custom”"
  566. width="110px"
  567. >
  568. <template #default="scope">
  569. <span>{{ scope.row.freeGold / 100 }}</span>
  570. </template>
  571. </el-table-column>
  572. <el-table-column
  573. prop="remark"
  574. label="备注"
  575. width="200px"
  576. show-overflow-tooltip
  577. />
  578. <el-table-column prop="payWay" label="支付方式" width="100px" />
  579. <el-table-column
  580. prop="rechargeVoucher"
  581. label="支付凭证"
  582. width="150px"
  583. >
  584. <template #default="scope">
  585. <el-image
  586. :preview-src-list="[scope.row.rechargeVoucher]"
  587. preview-teleported="true"
  588. :src="scope.row.rechargeVoucher"
  589. alt="凭证"
  590. style="width: 50px; height: 50px"
  591. />
  592. </template>
  593. </el-table-column>
  594. <el-table-column prop="name" label="提交人" width="100px" />
  595. <el-table-column prop="status" label="状态" width="100px">
  596. <template #default="scope">
  597. <span v-if="scope.row.status === 1">
  598. <div class="status">
  599. <span class="green-dot"></span>
  600. <span>已通过</span>
  601. </div>
  602. </span>
  603. <span v-if="scope.row.status === 0">
  604. <div class="status">
  605. <span class="grey-dot"></span>
  606. <span>待审核</span>
  607. </div>
  608. </span>
  609. <span v-if="scope.row.status === 2">
  610. <div class="status">
  611. <span class="red-dot"></span>
  612. <span>已驳回</span>
  613. </div>
  614. </span>
  615. </template>
  616. </el-table-column>
  617. <el-table-column
  618. prop="reson"
  619. label="驳回理由"
  620. width="200px"
  621. show-overflow-tooltip
  622. />
  623. <el-table-column
  624. prop="rechargeTime"
  625. sortable="“custom”"
  626. label="交款时间"
  627. width="200px"
  628. >
  629. <template #default="scope">
  630. {{
  631. moment(scope.row.rechargeTime).format('YYYY-MM-DD HH:mm:ss')
  632. }}
  633. </template>
  634. </el-table-column>
  635. <el-table-column
  636. prop="createTime"
  637. sortable="“custom”"
  638. label="提交时间"
  639. width="200px"
  640. />
  641. </el-table>
  642. </div>
  643. <!-- 分页 -->
  644. <div class="pagination" style="margin-top: 20px">
  645. <el-pagination
  646. background
  647. :page-size="getObj.pageSize"
  648. :page-sizes="[5, 10, 20, 50, 100]"
  649. layout="total, sizes, prev, pager, next, jumper"
  650. :total="total"
  651. @size-change="handlePageSizeChange"
  652. @current-change="handleCurrentChange"
  653. ></el-pagination>
  654. </div>
  655. </el-card>
  656. </el-col>
  657. </el-row>
  658. </template>
  659. <style scoped>
  660. .pagination {
  661. display: flex;
  662. }
  663. .status {
  664. display: flex;
  665. }
  666. .head-card {
  667. display: flex;
  668. }
  669. .head-card-element {
  670. margin-right: 20px;
  671. }
  672. .head-card-btn {
  673. margin-left: auto;
  674. }
  675. </style>