金币系统前端
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.

587 lines
16 KiB

3 weeks ago
3 weeks ago
3 weeks ago
1 month ago
1 month ago
3 weeks ago
  1. <script setup>
  2. import { ref, onMounted, reactive, computed } from 'vue'
  3. import ElementPlus from 'element-plus'
  4. import { AiFillRead } from 'vue-icons-plus/ai'
  5. import { ElMessage, ElMessageBox } from 'element-plus'
  6. import axios from 'axios'
  7. import API from '../../api/index.js'
  8. import request from '@/util/http'
  9. // 变量
  10. //这是获取用户信息的接口
  11. const adminData = ref({})
  12. const getAdminData = async function () {
  13. try {
  14. const result = await request({
  15. url: '/admin/userinfo',
  16. data: {}
  17. })
  18. adminData.value = result
  19. console.log('请求成功', result)
  20. console.log('用户信息', adminData.value)
  21. } catch (error) {
  22. console.log('请求失败', error)
  23. }
  24. }
  25. // 充值明细表格
  26. const tableData = ref([])
  27. // 搜索======================================
  28. // 搜索detailVo
  29. const detailVo = ref({})
  30. // 搜索对象
  31. const getObj = ref({
  32. pageNum: 1,
  33. pageSize: 50
  34. })
  35. //分页总条目
  36. const total = ref(100)
  37. // 搜索对象时间
  38. const getTime = ref([])
  39. // 搜索活动列表
  40. const activity = ref([])
  41. // 所有信息
  42. const allData = ref([])
  43. // 搜索地区列表
  44. const area = ref([])
  45. //标签页默认高亮选项
  46. const activeName = ref('all')
  47. // 消费平台选项
  48. const consumePlatform = [
  49. {
  50. value: '4',
  51. label: '金币系统'
  52. },
  53. {
  54. value: '1',
  55. label: 'Homily Chart'
  56. },
  57. {
  58. value: '2',
  59. label: 'Homily Link'
  60. },
  61. {
  62. value: '3',
  63. label: 'ERP系统'
  64. }
  65. ]
  66. // //表格高度
  67. // const tableHeight = computed(function () {
  68. // return (getObj.value.pageSize + 1) * 41 + "px";
  69. // });
  70. // 方法
  71. // 合计数的显示数据
  72. const tableDataTotal = ref({})
  73. const rechargeCoin = ref(0)
  74. const freeCoin = ref(0)
  75. const taskCoin = ref(0)
  76. const totalCoin = ref(0)
  77. // 搜索=========================================================================================================================================================
  78. // 搜索方法
  79. const get = async function (val) {
  80. try {
  81. // 地区赋值
  82. if (adminData.value.area != '总部') {
  83. detailVo.value.area = adminData.value.area
  84. }
  85. // 搜索参数页码赋值
  86. if (typeof val === 'number') {
  87. getObj.value.pageNum = val
  88. }
  89. // 搜索参数时间赋值
  90. if (getTime.value != null) {
  91. if (getTime.value.startDate != '' && getTime.value.endDate != '') {
  92. detailVo.value.startDate = getTime.value[0]
  93. detailVo.value.endDate = getTime.value[1]
  94. }
  95. } else {
  96. detailVo.value.startDate = ''
  97. detailVo.value.endDate = ''
  98. }
  99. detailVo.value.sortField = sortField.value
  100. detailVo.value.sortOrder = sortOrder.value
  101. console.log('搜索参数', getObj.value)
  102. // 发送POST请求
  103. const result = await request({
  104. url: '/consume/select',
  105. data: {
  106. ...getObj.value,
  107. consumeDetail: { ...detailVo.value }
  108. }
  109. })
  110. // 合计数的接口
  111. // 复制一份 detail.value 并移除排序字段和排序方式
  112. const detailWithoutSort = { ...detailVo.value }
  113. delete detailWithoutSort.sortField
  114. delete detailWithoutSort.sortOrder
  115. const result2 = await request({
  116. url: '/consume/SumConsume',
  117. data: {
  118. ...detailWithoutSort
  119. }
  120. })
  121. // 将响应结果存储到响应式数据中
  122. console.log('请求成功', result)
  123. console.log('请求成功2', result2)
  124. // 存储表格数据
  125. tableData.value = result.data.list
  126. tableDataTotal.value = result2.data
  127. if (result2.data == null) {
  128. console.log('请求成功2', result2)
  129. tableDataTotal.value = {
  130. sumRcion: 0,
  131. sumFcion: 0,
  132. sumTcion: 0,
  133. sumcion: 0
  134. }
  135. }
  136. console.log('tableDataT', tableDataTotal)
  137. // 修改为保留两位小数
  138. rechargeCoin.value = parseFloat(
  139. (tableDataTotal.value.sumRcion / 100).toFixed(2)
  140. )
  141. freeCoin.value = parseFloat(
  142. (tableDataTotal.value.sumFcion / 100).toFixed(2)
  143. )
  144. taskCoin.value = parseFloat(
  145. (tableDataTotal.value.sumTcion / 100).toFixed(2)
  146. )
  147. totalCoin.value = parseFloat(
  148. (tableDataTotal.value.sumcion / 100).toFixed(2)
  149. )
  150. console.log('tableData', tableData.value)
  151. // 存储分页总数
  152. total.value = result.data.total
  153. console.log('total', total.value)
  154. } catch (error) {
  155. console.log('请求失败', error)
  156. // 在这里可以处理错误逻辑,比如显示错误提示等
  157. }
  158. }
  159. // 搜索
  160. const search = function () {
  161. getObj.value.pageNum = 1
  162. get()
  163. }
  164. // 重置
  165. const reset = function () {
  166. detailVo.value.productName = ''
  167. detailVo.value.consumePlatform = ''
  168. detailVo.value.consumeType = ''
  169. detailVo.value.startDate = ''
  170. detailVo.value.endDate = ''
  171. sortField.value = ''
  172. sortOrder.value = ''
  173. getTime.value = {}
  174. }
  175. // 今天
  176. const getToday = function () {
  177. const today = new Date()
  178. const startDate = new Date(
  179. today.getFullYear(),
  180. today.getMonth(),
  181. today.getDate()
  182. )
  183. const endDate = new Date(
  184. today.getFullYear(),
  185. today.getMonth(),
  186. today.getDate() + 1
  187. )
  188. getTime.value = [startDate, endDate]
  189. console.log('getTime', getTime.value)
  190. get()
  191. }
  192. // 昨天
  193. const getYesterday = function () {
  194. const yesterday = new Date()
  195. yesterday.setDate(yesterday.getDate() - 1)
  196. const startDate = new Date(
  197. yesterday.getFullYear(),
  198. yesterday.getMonth(),
  199. yesterday.getDate()
  200. )
  201. const endDate = new Date(
  202. yesterday.getFullYear(),
  203. yesterday.getMonth(),
  204. yesterday.getDate() + 1
  205. )
  206. getTime.value = [startDate, endDate]
  207. console.log('getTime', getTime.value)
  208. get()
  209. }
  210. // 近7天
  211. const get7Days = function () {
  212. const today = new Date()
  213. const startDate = new Date(
  214. today.getFullYear(),
  215. today.getMonth(),
  216. today.getDate() - 6
  217. )
  218. const endDate = new Date(
  219. today.getFullYear(),
  220. today.getMonth(),
  221. today.getDate() + 1
  222. )
  223. getTime.value = [startDate, endDate]
  224. console.log('getTime', getTime.value)
  225. get()
  226. }
  227. //点击标签页
  228. const handleClick = function (tab, event) {
  229. if (tab.props.name === 'all') {
  230. adminAll()
  231. } else if (tab.props.name === 'wait') {
  232. adminWait()
  233. } else if (tab.props.name === 'pass') {
  234. adminPass()
  235. } else if (tab.props.name === 'reject') {
  236. adminReject()
  237. }
  238. }
  239. // 挂载
  240. onMounted(async function () {
  241. await getAdminData()
  242. await get()
  243. // getActivity();
  244. // await getArea();
  245. })
  246. // 验证跳转输入框的数字是否合法
  247. const checkNumber = function () {
  248. if (typeof parseInt(getObj.value.pageNum) === 'number') {
  249. console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize))
  250. if (
  251. getObj.value.pageNum > 0 &&
  252. getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
  253. ) {
  254. getObj.value.pageNum = parseInt(getObj.value.pageNum)
  255. console.log('输入的数字合法')
  256. get()
  257. } else {
  258. //提示
  259. ElMessage({
  260. type: 'error',
  261. message: '请检查输入内容'
  262. })
  263. }
  264. } else {
  265. //提示
  266. ElMessage({
  267. type: 'error',
  268. message: '请检查输入内容'
  269. })
  270. }
  271. }
  272. // 查询商品的接口
  273. const goods = ref([])
  274. const getGoods = async function () {
  275. try {
  276. // 发送POST请求
  277. const result = await request({
  278. url: '/product/findProductName',
  279. data: {}
  280. })
  281. // 将响应结果存储到响应式数据中
  282. console.log('请求成功product', result)
  283. // 存储全部数据
  284. goods.value = result.data
  285. console.log('goods 数据', goods.value) // 修改日志输出
  286. } catch (error) {
  287. console.log('请求失败', error)
  288. // 在这里可以处理错误逻辑,比如显示错误提示等
  289. }
  290. }
  291. getGoods()
  292. // 新增排序字段和排序方式
  293. const sortField = ref('')
  294. const sortOrder = ref('')
  295. // 处理排序事件
  296. const handleSortChange = (column) => {
  297. console.log('排序字段:', column.prop)
  298. console.log('排序方式:', column.order)
  299. if (column.prop === 'rechargeCoin') {
  300. sortField.value = 'recharge_coin'
  301. } else if (column.prop === 'taskCoin') {
  302. sortField.value = 'task_coin'
  303. } else if (column.prop === 'freeCoin') {
  304. sortField.value = 'free_coin'
  305. } else if (column.prop === 'createTime') {
  306. sortField.value = 'create_time'
  307. }
  308. sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
  309. get()
  310. }
  311. const handlePageSizeChange = function (val) {
  312. getObj.value.pageSize = val
  313. get()
  314. }
  315. const handleCurrentChange = function (val) {
  316. getObj.value.pageNum = val
  317. get()
  318. }
  319. </script>
  320. <template>
  321. <el-row>
  322. <el-col>
  323. <el-card style="margin-bottom: 20px">
  324. <el-row style="margin-bottom: 10px">
  325. <el-col :span="8">
  326. <div class="head-card-element">
  327. <el-text class="mx-1" size="large">商品名称</el-text>
  328. <el-select
  329. v-model="detailVo.productName"
  330. placeholder="请选择商品名称"
  331. size="large"
  332. style="width: 240px"
  333. clearable
  334. >
  335. <!-- 修改 v-for 绑定逻辑 -->
  336. <el-option
  337. v-for="(item, index) in goods"
  338. :key="index"
  339. :label="item"
  340. :value="item"
  341. />
  342. </el-select>
  343. </div>
  344. </el-col>
  345. <el-col :span="8">
  346. <div class="head-card-element">
  347. <el-text class="mx-1" size="large">消费平台</el-text>
  348. <el-select
  349. v-model="detailVo.consumePlatform"
  350. placeholder="请选择消费平台"
  351. size="large"
  352. style="width: 240px"
  353. clearable
  354. >
  355. <el-option
  356. v-for="item in consumePlatform"
  357. :key="item.value"
  358. :label="item.label"
  359. :value="item.value"
  360. />
  361. </el-select>
  362. </div>
  363. </el-col>
  364. <el-col :span="8">
  365. <!-- <div class="head-card-element">
  366. <el-text class="mx-1" size="large">消费类型</el-text>
  367. <el-select
  368. v-model="detailVo.consumeType"
  369. placeholder="请选择消费类型"
  370. size="large"
  371. style="width: 240px"
  372. clearable
  373. >
  374. <el-option
  375. v-for="item in consumeType"
  376. :key="item"
  377. :label="item.label"
  378. :value="item.value"
  379. />
  380. </el-select>
  381. </div> -->
  382. </el-col>
  383. </el-row>
  384. <el-row>
  385. <el-col :span="21">
  386. <div class="head-card-element">
  387. <el-text class="mx-1" size="large">消费时间</el-text>
  388. <el-date-picker
  389. v-model="getTime"
  390. type="datetimerange"
  391. range-separator="至"
  392. start-placeholder="起始时间"
  393. end-placeholder="结束时间"
  394. />
  395. <el-button style="margin-left: 10px" @click="getToday()"
  396. ></el-button
  397. >
  398. <el-button @click="getYesterday()"></el-button>
  399. <el-button @click="get7Days()">近7天</el-button>
  400. </div>
  401. </el-col>
  402. <el-col :span="3">
  403. <div class="head-card-btn">
  404. <el-button @click="reset()">重置</el-button>
  405. <el-button type="primary" @click="search()">查询</el-button>
  406. </div>
  407. </el-col>
  408. </el-row>
  409. </el-card>
  410. </el-col>
  411. </el-row>
  412. <el-row>
  413. <el-col>
  414. <el-card>
  415. <div>
  416. 消费金币总数{{ Math.abs(totalCoin) }}永久金币{{
  417. Math.abs(rechargeCoin)
  418. }}免费金币{{ Math.abs(freeCoin) }}任务金币{{
  419. Math.abs(taskCoin)
  420. }}
  421. </div>
  422. <!-- 设置表格容器的高度和滚动样式 -->
  423. <div style="height: 576px; overflow-y: auto">
  424. <el-table
  425. :data="tableData"
  426. style="width: 100%"
  427. height="576px"
  428. @sort-change="handleSortChange"
  429. >
  430. <el-table-column
  431. type="index"
  432. label="序号"
  433. width="100px"
  434. fixed="left"
  435. >
  436. <template #default="scope">
  437. <span>{{
  438. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  439. }}</span>
  440. </template>
  441. </el-table-column>
  442. <!-- 固定姓名列 -->
  443. <el-table-column
  444. prop="username"
  445. label="姓名"
  446. width="150px"
  447. fixed="left"
  448. />
  449. <!-- 固定精网号列 -->
  450. <el-table-column
  451. prop="jwcode"
  452. label="精网号"
  453. width="110px"
  454. fixed="left"
  455. />
  456. <el-table-column prop="area" label="所属地区" width="110px" />
  457. <el-table-column prop="productName" label="商品" width="160px" />
  458. <el-table-column
  459. prop="consumePlatform"
  460. label="消费平台"
  461. width="120px"
  462. >
  463. <template #default="scope">
  464. <!-- 使用非严格相等比较 -->
  465. <span v-if="scope.row.consumePlatform == 1">Homily Chart</span>
  466. <span v-if="scope.row.consumePlatform == 2">Homily Link</span>
  467. <span v-if="scope.row.consumePlatform == 3">ERP系统</span>
  468. <span v-if="scope.row.consumePlatform == 4">金币系统</span>
  469. </template>
  470. </el-table-column>
  471. <el-table-column
  472. prop="consumeType"
  473. label="消费类型"
  474. width="120px"
  475. />
  476. <el-table-column
  477. prop="rechargeTotal"
  478. label="消费金币总数"
  479. width="120px"
  480. >
  481. <template #default="scope">
  482. {{
  483. (scope.row.taskCoin * -1 +
  484. scope.row.freeCoin * -1 +
  485. scope.row.rechargeCoin * -1) /
  486. 100
  487. }}
  488. </template>
  489. </el-table-column>
  490. <el-table-column
  491. prop="rechargeCoin"
  492. label="永久金币"
  493. sortable="“custom”"
  494. width="110px"
  495. >
  496. <template #default="scope">
  497. {{ (scope.row.rechargeCoin * -1) / 100 }}
  498. </template>
  499. </el-table-column>
  500. <el-table-column
  501. prop="freeCoin"
  502. label="免费金币"
  503. sortable="“custom”"
  504. width="110px"
  505. >
  506. <template #default="scope">
  507. {{ (scope.row.freeCoin * -1) / 100 }}
  508. </template>
  509. </el-table-column>
  510. <el-table-column
  511. prop="taskCoin"
  512. label="任务金币"
  513. sortable="“custom”"
  514. width="110px"
  515. >
  516. <template #default="scope">
  517. {{ (scope.row.taskCoin * -1) / 100 }}
  518. </template>
  519. </el-table-column>
  520. <el-table-column
  521. prop="remark"
  522. label="备注"
  523. width="200px"
  524. show-overflow-tooltip
  525. />
  526. <el-table-column prop="name" label="提交人" width="110px" />
  527. <el-table-column
  528. prop="createTime"
  529. label="消费时间"
  530. sortable="“custom”"
  531. width="180px"
  532. />
  533. </el-table>
  534. </div>
  535. <!-- 分页 -->
  536. <div class="pagination">
  537. <el-pagination
  538. background
  539. :page-size="getObj.pageSize"
  540. :page-sizes="[5, 10, 20, 50, 100]"
  541. layout="total, sizes, prev, pager, next, jumper"
  542. :total="total"
  543. @size-change="handlePageSizeChange"
  544. @current-change="handleCurrentChange"
  545. ></el-pagination>
  546. </div>
  547. </el-card>
  548. </el-col>
  549. </el-row>
  550. </template>
  551. <style scoped>
  552. .status {
  553. display: flex;
  554. }
  555. .head-card {
  556. display: flex;
  557. }
  558. .head-card-element {
  559. margin-right: 20px;
  560. }
  561. .head-card-btn {
  562. margin-left: auto;
  563. }
  564. .pagination {
  565. display: flex;
  566. margin-top: 20px;
  567. }
  568. </style>