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.

586 lines
16 KiB

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