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.

191 lines
6.7 KiB

2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
3 weeks ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
  1. <template>
  2. <el-card style="margin-bottom: 1vh;">
  3. <el-text size="large">精网号</el-text>
  4. <el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
  5. <el-text size="large" style="margin-left:20px">地区</el-text>
  6. <el-select v-model="searchObj.dept" placeholder="请选择地区" style="width: 240px" clearable>
  7. <el-option v-for="item in marketOptions" :key="item" :label="item" :value="item" />
  8. </el-select>
  9. <div style="float: right;">
  10. <el-button type="success" @click="reset">重置</el-button>
  11. <el-button type="primary" @click="search">查询</el-button>
  12. </div>
  13. </el-card>
  14. <el-card>
  15. <div class="stats-card">
  16. 现有金豆数{{ format3(stats.sumBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
  17. 付费金豆数{{ format3(stats.permanentBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
  18. 免费金豆数{{ format3(stats.freeBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
  19. 消费金豆总数{{ format3(stats.consumeSum) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
  20. </div>
  21. <el-table :data="tableData" height="65vh" @sort-change="handleSortChange" :row-style="{ height: '60px' }">
  22. <el-table-column type="index" label="序号" width="100px" fixed="left">
  23. <template #default="scope">
  24. <span>{{
  25. scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize
  26. }}</span>
  27. </template>
  28. </el-table-column>
  29. <el-table-column label="姓名" style="width: 120px;" prop="name" show-overflow-tooltip />
  30. <el-table-column label="精网号" style="width: 120px;" prop="jwcode" />
  31. <el-table-column label="所属地区" style="width: 120px;" prop="dept" />
  32. <el-table-column label="现有金豆" style="width: 120px;" prop="beanNum" sortable="custom" />
  33. <el-table-column label="免费金豆" style="width: 120px;" prop="freeBean" sortable="custom" />
  34. <el-table-column label="付费金豆" style="width: 120px;" prop="buyBean" sortable="custom" />
  35. <el-table-column label="历史消费" style="width: 120px;" prop="totalCostBean" sortable="custom" />
  36. </el-table>
  37. <el-pagination class="pagination" v-model:current-page="pagination.pageNum"
  38. v-model:page-size="pagination.pageSize" layout="total, sizes, prev, pager, next, jumper"
  39. :total="pagination.total" @size-change="handlePageSizeChange"
  40. @current-change="handleCurrentChange"></el-pagination>
  41. </el-card>
  42. </template>
  43. <script setup>
  44. import { ref, onMounted } from 'vue'
  45. import API from '@/util/http.js'
  46. import { useAdminStore } from "@/store/index.js";
  47. import { storeToRefs } from "pinia";
  48. const adminStore = useAdminStore();
  49. const { adminData, menuTree } = storeToRefs(adminStore);
  50. import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
  51. import { ElMessage } from 'element-plus';
  52. const tableData = ref([])
  53. const marketOptions = ref([])
  54. const searchObj = ref({
  55. jwcode: '',
  56. dept: '',
  57. sortField: '',
  58. sortOrder: ''
  59. })
  60. const stats = ref({
  61. sumBean: 0,
  62. permanentBean: 0,
  63. freeBean: 0,
  64. consumeSum: 0
  65. })
  66. const pagination = ref({
  67. pageNum: 1,
  68. pageSize: 50,
  69. total: 0
  70. })
  71. const get = async function () {
  72. try {
  73. trim()
  74. if(searchObj.value.jwcode){
  75. const numRef = /^\d{1,9}$/;
  76. if(!numRef.test(searchObj.value.jwcode)){
  77. ElMessage.error('请检查精网号格式')
  78. return
  79. }
  80. }
  81. const params = {
  82. beanUser: { //金豆客户列表
  83. jwcode: searchObj.value.jwcode, //精网号
  84. dept: searchObj.value.dept, //地区
  85. sortField: searchObj.value.sortField,//排序字段
  86. sortOrder: searchObj.value.sortOrder//正序倒序
  87. },
  88. pageNum: pagination.value.pageNum,
  89. pageSize: pagination.value.pageSize
  90. }
  91. const res = await API({
  92. url: '/beanUser/userBean',
  93. data: params
  94. })
  95. if (res.code === 200) {
  96. tableData.value = res.data.list
  97. pagination.value.total = res.data.total
  98. }
  99. } catch (error) {
  100. console.log(error)
  101. }
  102. }
  103. const getStats = async () => {
  104. try {
  105. const params = {
  106. beanUser:{
  107. jwcode: searchObj.value.jwcode,
  108. dept: searchObj.value.dept
  109. }
  110. }
  111. const res = await API({
  112. url: '/beanUser/userBeanSum',
  113. data: params
  114. })
  115. stats.value.sumBean = res.data.sumBean
  116. stats.value.permanentBean = res.data.permanentBean
  117. stats.value.freeBean = res.data.freeBean
  118. stats.value.consumeSum = res.data.consumeSum
  119. console.log('see see stats和搜索对象', stats.value, params)
  120. } catch (error) {
  121. console.log('请求失败', error)
  122. }
  123. }
  124. const handleSortChange = (column) => {
  125. if (column.prop === 'beanNum') {
  126. searchObj.value.sortField = 'jinbi'
  127. } else if (column.prop === 'freeBean') {
  128. searchObj.value.sortField = 'jinbi_free'
  129. } else if (column.prop === 'buyBean') {
  130. searchObj.value.sortField = 'jinbi_buy'
  131. } else if (column.prop === 'totalCostBean') {
  132. searchObj.value.sortField = 'jinbi_cost_total'
  133. } else {
  134. searchObj.value.sortField = ''
  135. }
  136. searchObj.value.sortOrder = column.order === 'ascending' ? 'asc' : 'desc'
  137. console.log('排序字段:', searchObj.value.sortField,'排序方式:', searchObj.value.sortOrder)
  138. search()
  139. }
  140. const getmarkets = async () => {
  141. try {
  142. const result = await API({ url: '/beanUser/getDept', data: {} })
  143. marketOptions.value = result.data || []
  144. } catch (error) {
  145. console.error('获取地区列表失败', error)
  146. }
  147. }
  148. // 精网号去空格
  149. const trim = () => {
  150. if (searchObj.value.jwcode) {
  151. searchObj.value.jwcode = searchObj.value.jwcode.replace(/\s/g, '');
  152. }
  153. }
  154. const reset = function () {
  155. searchObj.value.jwcode = ''
  156. searchObj.value.dept = ''
  157. search()
  158. }
  159. const handlePageSizeChange = function (val) {
  160. pagination.value.pageSize = val
  161. search()
  162. }
  163. const handleCurrentChange = function (val) {
  164. pagination.value.pageNum = val
  165. search()
  166. }
  167. const format3 = (num) => {
  168. // 每三位添加逗号
  169. return num.toLocaleString('en-US')
  170. }
  171. const search = () => {
  172. get()
  173. getStats()
  174. }
  175. onMounted(() => {
  176. search()
  177. getmarkets()
  178. getStats()
  179. console.log('页面接收到的adminData:', adminData.value)
  180. })
  181. </script>
  182. <style scoped>
  183. </style>