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.

198 lines
7.0 KiB

2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
  1. <template>
  2. <el-card style="margin-bottom: 20px;">
  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="get">查询</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="650px" @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'
  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. if(findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Balance)){
  73. try {
  74. trim()
  75. if(searchObj.value.jwcode){
  76. const numRef = /^\d{1,9}$/;
  77. if(!numRef.test(searchObj.value.jwcode)){
  78. ElMessage.error('请检查精网号格式')
  79. return
  80. }
  81. }
  82. const params = {
  83. beanUser: { //金豆客户列表
  84. jwcode: searchObj.value.jwcode, //精网号
  85. dept: searchObj.value.dept, //地区
  86. sortField: searchObj.value.sortField,//排序字段
  87. sortOrder: searchObj.value.sortOrder//正序倒序
  88. },
  89. pageNum: pagination.value.pageNum,
  90. pageSize: pagination.value.pageSize
  91. }
  92. const res = await API({
  93. url: '/beanUser/userBean',
  94. data: params
  95. })
  96. if (res.code === 200) {
  97. tableData.value = res.data.list
  98. pagination.value.total = res.data.total
  99. }
  100. } catch (error) {
  101. console.log(error)
  102. }
  103. }else{
  104. ElMessage.error('无此权限')
  105. }
  106. }
  107. const getStats = async () => {
  108. if (findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Balance)) {
  109. try {
  110. const params = {
  111. beanUser:{
  112. jwcode: searchObj.value.jwcode,
  113. dept: searchObj.value.dept
  114. }
  115. }
  116. const res = await API({
  117. url: '/beanUser/userBeanSum',
  118. data: params
  119. })
  120. stats.value.sumBean = res.data.sumBean
  121. stats.value.permanentBean = res.data.permanentBean
  122. stats.value.freeBean = res.data.freeBean
  123. stats.value.consumeSum = res.data.consumeSum
  124. console.log('see see stats和搜索对象', stats.value, params)
  125. } catch (error) {
  126. console.log('请求失败', error)
  127. }
  128. }else{
  129. ElMessage.error('无此权限')
  130. }
  131. }
  132. const handleSortChange = (column) => {
  133. if (column.prop === 'beanNum') {
  134. searchObj.value.sortField = 'jinbi'
  135. } else if (column.prop === 'freeBean') {
  136. searchObj.value.sortField = 'jinbi_free'
  137. } else if (column.prop === 'buyBean') {
  138. searchObj.value.sortField = 'jinbi_buy'
  139. } else if (column.prop === 'totalCostBean') {
  140. searchObj.value.sortField = 'jinbi_cost_total'
  141. } else {
  142. searchObj.value.sortField = ''
  143. }
  144. searchObj.value.sortOrder = column.order === 'ascending' ? 'asc' : 'desc'
  145. console.log('排序字段:', searchObj.value.sortField,'排序方式:', searchObj.value.sortOrder)
  146. get()
  147. }
  148. const getmarkets = async () => {
  149. try {
  150. const result = await API({ url: '/beanUser/getDept', data: {} })
  151. marketOptions.value = result.data || []
  152. } catch (error) {
  153. console.error('获取地区列表失败', error)
  154. }
  155. }
  156. // 精网号去空格
  157. const trim = () => {
  158. if (searchObj.value.jwcode) {
  159. searchObj.value.jwcode = searchObj.value.jwcode.replace(/\s/g, '');
  160. }
  161. }
  162. const reset = function () {
  163. searchObj.value.jwcode = ''
  164. searchObj.value.dept = ''
  165. get()
  166. }
  167. const handlePageSizeChange = function (val) {
  168. pagination.value.pageSize = val
  169. get()
  170. }
  171. const handleCurrentChange = function (val) {
  172. pagination.value.pageNum = val
  173. get()
  174. }
  175. const format3 = (num) => {
  176. // 每三位添加逗号
  177. return num.toLocaleString('en-US')
  178. }
  179. onMounted(() => {
  180. get()
  181. getmarkets()
  182. getStats()
  183. console.log('页面接收到的adminData:', adminData.value)
  184. })
  185. </script>
  186. <style scoped>
  187. /* .stats-card {
  188. background-color: #EBEEF5;
  189. padding: 5px;
  190. } */
  191. </style>