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.

728 lines
24 KiB

7 months ago
6 months ago
5 months ago
7 months ago
7 months ago
5 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
5 months ago
5 months ago
5 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
7 months ago
  1. <template>
  2. <el-card class="card1" style="margin-bottom: 0.5vh;">
  3. <el-col style="margin-bottom: 1vh">
  4. <div class="select">
  5. <div class="selectRow">
  6. <el-text class="text" size="large">{{ $t('common.jwcode') }}</el-text>
  7. <el-input class="selectContent" v-model="searchForm.jwcode" :placeholder="t('common.jwcodePlaceholder')"
  8. style="width: 12vw;margin-right:1vw" clearable />
  9. </div>
  10. <div class="selectRow">
  11. <el-text class="text" size="large">{{ $t('common.market') }}</el-text>
  12. <el-cascader v-model="selectedMarkets" :options="marketOptions" :placeholder="$t('common.marketPlaceholder')" clearable
  13. style="width: 12vw" @change="handleMarketChange" />
  14. </div>
  15. </div>
  16. </el-col>
  17. <el-col>
  18. <div class="select">
  19. <div class="selectRow" style="width: 36vw;">
  20. <el-text class="text" size="large" v-show="checkTab === 'pending'">{{ $t('common.submitTime') }}</el-text>
  21. <el-text class="text" size="large" v-show="checkTab === 'reject' || checkTab === 'pass'">{{ $t('common.auditTime') }}</el-text>
  22. <el-date-picker v-model="dateRange" type="datetimerange" :range-separator="t('common.to')" :start-placeholder="$t('common.startTime')"
  23. :end-placeholder="$t('common.endTime')" class="selectContent" style="width: 25vw;margin-right:1vw"
  24. @change="handleDatePickerChange" :default-time="defaultTime" />
  25. <!-- <el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button>-->
  26. <!-- <el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"></el-button>-->
  27. <!-- <el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button>-->
  28. </div>
  29. <div class="selectRow" style="justify-content: flex-start;">
  30. <el-button type="primary" @click="handleSearch">{{ t('common.search') }}</el-button>
  31. <el-button type="success" @click="resetSearch">{{ t('common.reset') }}</el-button>
  32. </div>
  33. </div>
  34. </el-col>
  35. </el-card>
  36. <el-card class="card2">
  37. <!-- 将el-tabs替换为按钮组 -->
  38. <div class="custom-button-group">
  39. <el-button v-if="hasbeanWait && hasbeanWaitShow" :type="checkTab === 'pending' ? 'primary' : 'default'"
  40. class="custom-tab-button" @click="adminWait">
  41. {{ $t('audit.waitAudit') }}
  42. </el-button>
  43. <el-button v-if="hasbeanThrough" :type="checkTab === 'pass' ? 'primary' : 'default'" class="custom-tab-button"
  44. @click="adminPass">
  45. {{ $t('audit.passed') }}
  46. </el-button>
  47. <el-button v-if="hasbeanReject" :type="checkTab === 'reject' ? 'primary' : 'default'" class="custom-tab-button"
  48. @click="adminReject">
  49. {{ $t('audit.rejected') }}
  50. </el-button>
  51. </div>
  52. <div class="goldStatistics">
  53. {{ $t('audit.totalNum') }}{{ format3(stats.num) }}{{ $t('common.条') }}&nbsp;&nbsp;&nbsp;&nbsp;
  54. {{ $t('audit.totalBean') }}{{ format3(stats.beanNum) }}{{ $t('common.goldBean') }}&nbsp;&nbsp;&nbsp;&nbsp;
  55. {{ $t('audit.permanentBean') }}{{ format3(stats.permanentBean) }}{{ $t('common.goldBean') }}&nbsp;&nbsp;&nbsp;&nbsp;
  56. {{ $t('audit.freeBean') }}{{ format3(stats.freeBean) }}{{ $t('common.goldBean') }}
  57. </div>
  58. <el-table :data="tableData" height="65vh" @sort-change="handleSortChange" :row-style="{ height: '50px' }">
  59. <el-table-column type="index" :label="$t('audit.id')" width="80">
  60. <template #default="scope">
  61. {{ scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize }}
  62. </template>
  63. </el-table-column>
  64. <el-table-column prop="name" :label="$t('audit.name')" width="120" show-overflow-tooltip />
  65. <el-table-column prop="jwcode" :label="$t('audit.jwcode')" width="120" />
  66. <el-table-column prop="market" :label="$t('audit.market')" width="120" />
  67. <el-table-column prop="permanentBean" :label="$t('audit.permanentBean')" width="120" sortable="custom" />
  68. <el-table-column prop="freeBean" :label="$t('audit.freeBean')" width="120" sortable="custom" />
  69. <el-table-column prop="remark" :label="$t('audit.note')" width="150" show-overflow-tooltip />
  70. <el-table-column prop="submitName" :label="$t('audit.submitter')" width="120" />
  71. <el-table-column v-if="checkTab === 'reject'" prop="reason" :label="$t('audit.rejectReason')" width="120" show-overflow-tooltip />
  72. <el-table-column v-if="checkTab !== 'pending'" prop="auditName" :label="$t('audit.auditor')" width="120" />
  73. <el-table-column prop="createTime" :label="$t('audit.submitTime')" width="180" sortable="custom">
  74. <template #default="{ row }">
  75. {{ moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
  76. </template>
  77. </el-table-column>
  78. <el-table-column v-if="checkTab !== 'pending'" prop="auditTime" :label="$t('audit.auditTime')" width="240" sortable="custom">
  79. <template #default="{ row }">
  80. {{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }}
  81. </template>
  82. </el-table-column>
  83. <el-table-column v-if="checkTab === 'pending' && (hasbeanWaitThough || hasbeanWaitReject)" fixed="right"
  84. prop="operation" :label="$t('audit.operation')" width="200px">
  85. <template #default="scope">
  86. <div class="operation">
  87. <el-link :underline="false" class="pass-btn" v-if="hasbeanWaitThough" :disabled="clicked || cancelClicked"
  88. type="primary" @click="showApproveDialog(scope.row)">
  89. {{ $t('common.pass') }}
  90. </el-link>
  91. <el-link :underline="false" class="reject-btn" v-if="hasbeanWaitReject" :disabled="clicked || cancelClicked"
  92. type="primary" @click="showRejectDialog(scope.row)">
  93. {{ $t('common.reject') }}
  94. </el-link>
  95. </div>
  96. </template>
  97. </el-table-column>
  98. </el-table>
  99. <div class="pagination">
  100. <el-pagination background :current-page="pagination.pageNum" :page-size="pagination.pageSize"
  101. layout="total, sizes, prev, pager, next, jumper" :total="stats.num" @size-change="handlePageSizeChange"
  102. @current-change="handleCurrentChange"></el-pagination>
  103. </div>
  104. </el-card>
  105. <!-- 驳回理由对话框 -->
  106. <el-dialog v-model="rejectReasonDialogVisible" :title="$t('audit.rejectReason')" width="500px" @close="handleRejectReasonCancel">
  107. <el-form>
  108. <el-form-item :label="$t('audit.rejectReason')" required>
  109. <el-input v-model="reason" type="textarea" :rows="4" :placeholder="$t('audit.rejectReasonPlaceholder')" maxlength="200" show-word-limit />
  110. </el-form-item>
  111. </el-form>
  112. <template #footer>
  113. <span class="dialog-footer">
  114. <el-button @click="handleRejectReasonCancel">{{ $t('common.cancel') }}</el-button>
  115. <el-button :disabled="cancelClicked" type="primary" @click="handleReject">{{ $t('common.confirm') }}</el-button>
  116. </span>
  117. </template>
  118. </el-dialog>
  119. <ConfirmDialog
  120. v-model="rejectDialogVisible"
  121. :message="$t('audit.rejectRecord')"
  122. @confirm="showRejectReasonInput"
  123. @cancel="handleRejectCancel"
  124. @close="handleRejectClose"
  125. />
  126. <ConfirmDialog
  127. v-model="approveDialogVisible"
  128. :message="$t('audit.passRecord')"
  129. @confirm="throttledHandleApprove"
  130. @cancel="handleApproveCancel"
  131. @close="handleApproveClose"
  132. />
  133. </template>
  134. <script setup>
  135. import { onMounted, ref, watch } from 'vue'
  136. import { ElMessage } from 'element-plus'
  137. import API from '@/util/http.js'
  138. import moment from 'moment'
  139. import { useAdminStore } from "@/store/index.js";
  140. import { storeToRefs } from "pinia";
  141. import _ from 'lodash'
  142. import { permissionMapping, hasMenuPermission } from "@/utils/menuTreePermission.js"
  143. import ConfirmDialog from '@/components/dialogs/ConfirmDialog.vue';
  144. // i18n国际化包
  145. import { useI18n } from 'vue-i18n'
  146. const { t } = useI18n()
  147. const defaultTime = [
  148. new Date(2000, 1, 1, 0, 0, 0),
  149. new Date(2000, 2, 1, 23, 59, 59),
  150. ]
  151. const adminStore = useAdminStore();
  152. const { adminData, menuTree,flag } = storeToRefs(adminStore);
  153. // 监听全局flag状态变化
  154. watch(flag, (newFlag, oldFlag) => {
  155. // 当flag状态改变时,重新发送请求
  156. if (newFlag !== oldFlag) {
  157. // console.log('员工数据flag状态改变,重新加载数据', newFlag)
  158. get()
  159. getStats()
  160. // console.log('flag2',flag)
  161. }
  162. })
  163. import dayjs from "dayjs";
  164. import {reverseMarketMapping} from "@/utils/marketMap.js";
  165. const tableData = ref([])
  166. const marketOptions = ref("")
  167. const dateRange = ref([])
  168. const activeTimeRange = ref('')
  169. const sortField = ref('')
  170. const sortOrder = ref('')
  171. const checkTab = ref('pending')
  172. const rejectDialogVisible = ref(false)
  173. const rejectReasonDialogVisible = ref(false) // 驳回理由输入框显示状态
  174. const reason = ref('')
  175. const rejectRow = ref({
  176. id: null
  177. })// 驳回行数据
  178. const passRow = ref({
  179. id: null
  180. })// 通过行数据
  181. const popconfirmRef = ref(null)
  182. // 操作权限(金豆审核相关,与充值权限格式对齐)
  183. const hasbeanWait = ref(false) // 金豆审核待审核(对应beanWait:42)
  184. const hasbeanThrough = ref(false) // 金豆审核已通过(对应beanThrough:43)
  185. const hasbeanReject = ref(false) // 金豆审核已驳回(对应beanReject:44)
  186. const hasbeanWaitShow = ref(false) // 金豆审核待审核查看(对应beanWaitShow:45)
  187. const hasbeanWaitThough = ref(false) // 金豆审核通过(对应beanWaitThough:46)
  188. const hasbeanWaitReject = ref(false) // 金豆审核驳回(对应beanWaitReject:47)
  189. // 初始化权限状态(补充金豆审核权限,与充值权限初始化逻辑并列)
  190. const initPermissions = async () => {
  191. if (!menuTree.value || !menuTree.value.length) return;
  192. hasbeanWait.value = hasMenuPermission(menuTree.value, permissionMapping.gold_bean_audit_pending);
  193. hasbeanThrough.value = hasMenuPermission(menuTree.value, permissionMapping.pass_gold_bean_audit);
  194. hasbeanReject.value = hasMenuPermission(menuTree.value, permissionMapping.reject_gold_bean_audit);
  195. hasbeanWaitShow.value = hasMenuPermission(menuTree.value, permissionMapping.view_gold_bean_pending);
  196. hasbeanWaitThough.value = hasMenuPermission(menuTree.value, permissionMapping.gold_bean_audit_approved);
  197. hasbeanWaitReject.value = hasMenuPermission(menuTree.value, permissionMapping.gold_bean_audit_rejected);
  198. };
  199. // 设置对话框可见性
  200. const approveDialogVisible = ref(false)
  201. const clicked = ref(false)
  202. // 状态常量
  203. const STATUS = {
  204. PENDING: 0, // 待审核
  205. APPROVED: 1, // 通过
  206. REJECTED: 2 // 驳回
  207. }
  208. const cancelClicked = ref(false)
  209. // 存储地区选择变化
  210. const selectedMarkets = ref("")
  211. const searchForm = ref({
  212. jwcode: '',
  213. market: '',
  214. createStartTime: '',
  215. createEndTime: '',
  216. status: STATUS.PENDING,
  217. auditStartTime: '',
  218. auditEndTime: ''
  219. })
  220. const pagination = ref({
  221. pageNum: 1,
  222. pageSize: 50
  223. })
  224. // 合计数
  225. const stats = ref({
  226. num: 0,
  227. beanNum: 0,
  228. permanentBean: 0,
  229. freeBean: 0
  230. })
  231. const handleSortChange = (column) => {
  232. if (column.prop === 'permanentBean') {
  233. sortField.value = 'permanentBean'
  234. } else if (column.prop === 'freeBean') {
  235. sortField.value = 'freeBean'
  236. } else if (column.prop === 'createTime') {
  237. sortField.value = 'createTime'
  238. } else if (column.prop === 'auditTime') {
  239. sortField.value = 'auditTime'
  240. } else {
  241. sortField.value = ''
  242. }
  243. sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
  244. console.log('排序字段:', sortField.value)
  245. console.log('排序方式:', sortOrder.value)
  246. get()
  247. }
  248. const handleSearch = async function () {
  249. trimJwCode()
  250. if (searchForm.value.jwcode) {
  251. const numRef = /^\d{1,9}$/;
  252. if (!numRef.test(searchForm.value.jwcode)) {
  253. ElMessage.error(t('elmessage.checkJwcodeFormat'))
  254. return
  255. }
  256. }
  257. await get()
  258. await getStats()
  259. }
  260. const get = async function () {
  261. if (!hasbeanWaitShow) {
  262. ElMessage.error(t('elmessage.noPermission'))
  263. return
  264. }
  265. try {
  266. if (dateRange.value && dateRange.value.length === 2) {
  267. if (checkTab.value === 'pending') {
  268. searchForm.value.createStartTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
  269. searchForm.value.createEndTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
  270. } else {
  271. searchForm.value.auditStartTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
  272. searchForm.value.auditEndTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
  273. }
  274. } else {
  275. searchForm.value.createStartTime = ''
  276. searchForm.value.createEndTime = ''
  277. }
  278. if (checkTab.value === 'pending') {
  279. sortField.value = 'createTime'
  280. sortOrder.value = 'desc'
  281. } else {
  282. sortField.value = 'auditTime'
  283. sortOrder.value = 'desc'
  284. }
  285. const params = {
  286. pageNum: pagination.value.pageNum,//页码
  287. pageSize: pagination.value.pageSize,//页面大小
  288. beanAuditInfo: {
  289. jwcode: searchForm.value.jwcode,
  290. status: searchForm.value.status,
  291. market: searchForm.value.market,
  292. createStartTime: searchForm.value.createStartTime,
  293. createEndTime: searchForm.value.createEndTime,
  294. auditStartTime: searchForm.value.auditStartTime,
  295. auditEndTime: searchForm.value.auditEndTime,
  296. sortField: sortField.value,
  297. sortOrder: sortOrder.value,
  298. flag: flag.value
  299. }
  300. }
  301. console.log('看看传给后端的参数:', params)
  302. const res = await API({ url: '/beanAudit/selectBy', data: params })
  303. tableData.value = res.data.list || []
  304. } catch (error) {
  305. console.error('获取数据失败', error)
  306. }
  307. }
  308. const getStats = async () => {
  309. if (!hasbeanWaitShow) {
  310. ElMessage.error(t('elmessage.noPermission'))
  311. return
  312. }
  313. try {
  314. const params = {
  315. jwcode: searchForm.value.jwcode,
  316. status: searchForm.value.status,
  317. market: searchForm.value.market,
  318. createStartTime: searchForm.value.createStartTime,
  319. createEndTime: searchForm.value.createEndTime,
  320. auditStartTime: searchForm.value.auditStartTime,
  321. auditEndTime: searchForm.value.auditEndTime
  322. }
  323. const res = await API({
  324. url: '/beanAudit/statsBean',
  325. data: {
  326. ...params,
  327. flag: flag.value
  328. }
  329. })
  330. stats.value.num = res.data.num
  331. stats.value.permanentBean = res.data.permanentBean
  332. stats.value.freeBean = res.data.freeBean
  333. stats.value.beanNum = res.data.beanNum
  334. console.log('see see stats和搜索对象', stats.value, params)
  335. } catch (error) {
  336. console.log('请求失败', error)
  337. }
  338. }
  339. // 显示通过对话框
  340. const showApproveDialog = (row) => {
  341. if (!hasbeanWaitThough) {
  342. ElMessage.error(t('elmessage.noPermission'))
  343. return
  344. }
  345. passRow.value.id = row.id
  346. approveDialogVisible.value = true
  347. }
  348. // 处理通过操作
  349. // 为什么使用handleApproveConfirm页面就加载不出来,使用handleApprove就可以,
  350. // (发现问题:加了防抖,名称为handleApprove,修改名称一致即可)
  351. const handleApproveConfirm = async function() {// 不要再传row了!哪有row!!!
  352. if (!hasbeanWaitThough) {
  353. ElMessage.error(t('elmessage.noPermission'))
  354. return
  355. }
  356. clicked.value = true
  357. try {
  358. const params = {
  359. id: passRow.value.id,
  360. auditName: adminData.value.adminName
  361. }
  362. await API({ url: '/beanAudit/status1', data: params })
  363. ElMessage.success(t('elmessage.approveSuccess'))
  364. approveDialogVisible.value = false
  365. await get()
  366. clicked.value = false
  367. await getStats()
  368. } catch (error) {
  369. console.error(t('elmessage.approveFailed'), error)
  370. ElMessage.error(t('elmessage.operationFailed'))
  371. }
  372. }
  373. // 处理通过取消操作
  374. const handleApproveCancel = () => {
  375. approveDialogVisible.value = false
  376. }
  377. // 处理通过关闭操作
  378. const handleApproveClose = () => {
  379. approveDialogVisible.value = false
  380. }
  381. // 处理驳回操作
  382. const handleReject = async () => {
  383. if (!hasbeanWaitReject) {
  384. ElMessage.error(t('elmessage.noPermission'))
  385. return
  386. }
  387. cancelClicked.value = true
  388. if (!reason.value.trim()) {
  389. ElMessage.warning(t('elmessage.rejectReasonPlaceholder'))
  390. cancelClicked.value = false
  391. return
  392. }
  393. try {
  394. const params = {
  395. id: rejectRow.value.id,
  396. auditName: adminData.value.adminName,
  397. reason: reason.value
  398. }
  399. await API({ url: '/beanAudit/status2', data: params })
  400. ElMessage.success(t('elmessage.rejectSuccess'))
  401. rejectReasonDialogVisible.value = false
  402. await get()
  403. cancelClicked.value = false
  404. await getStats()
  405. } catch (error) {
  406. console.error(t('elmessage.rejectFailed'), error)
  407. ElMessage.error(t('elmessage.operationFailed'))
  408. }
  409. }
  410. // 确认驳回后显示理由输入框
  411. const showRejectReasonInput = () => {
  412. rejectDialogVisible.value = false // 关闭确认对话框
  413. rejectReasonDialogVisible.value = true // 打开驳回理由输入框
  414. }
  415. // 处理驳回取消操作
  416. const handleRejectCancel = () => {
  417. rejectDialogVisible.value = false
  418. }
  419. // 处理驳回关闭操作
  420. const handleRejectClose = () => {
  421. rejectDialogVisible.value = false
  422. }
  423. // 处理驳回理由对话框关闭和取消操作
  424. const handleRejectReasonCancel = () => {
  425. rejectReasonDialogVisible.value = false
  426. cancelClicked.value = false // 重置禁用状态
  427. reason.value = '' // 清空驳回理由
  428. }
  429. // 这个防抖好像还不能放在定义之前(handleApproveConfirm)
  430. const throttledHandleApprove = _.throttle(handleApproveConfirm, 5000, {
  431. trailing: false
  432. })
  433. // 显示驳回对话框
  434. const showRejectDialog = (row) => {
  435. if (!hasbeanWaitReject) {
  436. ElMessage.error(t('elmessage.noPermission'))
  437. return
  438. }
  439. rejectRow.value.id = row.id
  440. reason.value = ''
  441. rejectDialogVisible.value = true
  442. }
  443. const getToday = async function () {
  444. const today = dayjs()
  445. const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
  446. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  447. dateRange.value = [startTime, endTime]
  448. console.log('dateRange', dateRange.value)
  449. activeTimeRange.value = 'today'
  450. await get()
  451. await getStats()
  452. }
  453. const getYesterday = async function () {
  454. const today = dayjs()
  455. const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  456. const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
  457. dateRange.value = [startTime, endTime]
  458. console.log('dateRange', dateRange.value)
  459. activeTimeRange.value = 'yesterday'
  460. await get()
  461. await getStats()
  462. }
  463. const get7Days = async function () {
  464. const today = dayjs()
  465. const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  466. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  467. dateRange.value = [startTime, endTime]
  468. console.log('dateRange', dateRange.value)
  469. activeTimeRange.value = '7days'
  470. await get()
  471. await getStats()
  472. }
  473. const resetSearch = async function () {
  474. const status = searchForm.value.status;
  475. searchForm.value = {
  476. jwcode: '',
  477. market: '',
  478. createStartTime: '',
  479. createEndTime: '',
  480. status: status,
  481. auditStartTime: '',
  482. auditEndTime: ''
  483. }
  484. // 重置页码
  485. pagination.value.pageNum = 1
  486. selectedMarkets.value = []
  487. dateRange.value = []
  488. activeTimeRange.value = ''
  489. await get()
  490. await getStats()
  491. }
  492. const handleClick = async function (tab) {
  493. checkTab.value = tab.props.name
  494. if (tab.props.name === 'pending') {
  495. if (!hasbeanWait) {
  496. ElMessage.error(t('elmessage.noPermission'))
  497. return
  498. }
  499. adminWait()
  500. } else if (tab.props.name === 'pass') {
  501. if (!hasbeanThrough) {
  502. ElMessage.error(t('elmessage.noPermission'))
  503. return
  504. }
  505. adminPass()
  506. } else if (tab.props.name === 'reject') {
  507. if (!hasbeanReject) {
  508. ElMessage.error(t('elmessage.noPermission'))
  509. return
  510. }
  511. adminReject()
  512. }
  513. }
  514. // 待审核
  515. const adminWait = async function () {
  516. checkTab.value = 'pending'
  517. searchForm.value.status = STATUS.PENDING
  518. await get()
  519. await getStats()
  520. console.log('切换页面后:', checkTab.value, sortField.value, sortOrder.value)
  521. }
  522. // 已通过
  523. const adminPass = async function () {
  524. checkTab.value = 'pass'
  525. searchForm.value.status = STATUS.APPROVED
  526. await get()
  527. await getStats()
  528. console.log('切换页面后:', checkTab.value, sortField.value, sortOrder.value)
  529. }
  530. // 已驳回
  531. const adminReject = async function () {
  532. checkTab.value = 'reject'
  533. searchForm.value.status = STATUS.REJECTED
  534. await get()
  535. await getStats()
  536. console.log('切换页面后:', checkTab.value, sortField.value, sortOrder.value)
  537. }
  538. const handleMarketChange = (value) => {
  539. if (value && value.length > 0) {
  540. const lastValue = value[value.length - 1]
  541. searchForm.value.market = reverseMarketMapping[lastValue]
  542. } else {
  543. searchForm.value.market = ''
  544. }
  545. }
  546. const handleDatePickerChange = () => {
  547. activeTimeRange.value = ''
  548. }
  549. const handlePageSizeChange = function (val) {
  550. pagination.value.pageSize = val
  551. get()
  552. }
  553. const handleCurrentChange = function (val) {
  554. pagination.value.pageNum = val
  555. get()
  556. }
  557. const format3 = (num) => {
  558. // 每三位添加逗号
  559. return num.toLocaleString('en-US')
  560. }
  561. // 获取地区,修改为级联下拉框
  562. const getmarkets = async function () {
  563. try {
  564. const result = await API({
  565. url: '/market/selectMarket',
  566. });
  567. console.log('请求成功', result)
  568. // 递归转换树形结构为级联选择器需要的格式(跳过第一级节点)
  569. const transformTree = (nodes) => {
  570. // 直接处理第一级节点的子节点
  571. const allChildren = nodes.flatMap(node => node.children || []);
  572. return allChildren.map(child => {
  573. const grandchildren = child.children && child.children.length
  574. ? transformTree([child]) // 递归处理子节点
  575. : null;
  576. return {
  577. value: child.name,
  578. label: child.name,
  579. children: grandchildren
  580. }
  581. })
  582. }
  583. marketOptions.value = transformTree(result.data)
  584. console.log('转换后的地区树==============', marketOptions.value)
  585. } catch (error) {
  586. console.log('请求失败', error)
  587. }
  588. }
  589. const trimJwCode = () => {
  590. if (searchForm.value.jwcode) {
  591. searchForm.value.jwcode = searchForm.value.jwcode.replace(/\s/g, '');
  592. }
  593. }
  594. onMounted(async () => {
  595. await initPermissions()
  596. if (hasbeanWaitShow.value) {
  597. searchForm.value.status = 0
  598. } else if (hasbeanThrough.value) {
  599. searchForm.value.status = 1
  600. } else if (hasbeanReject) {
  601. searchForm.value.status = 2
  602. }
  603. getmarkets()
  604. await get()
  605. await getStats()
  606. console.log("看看通信来的用户身份", adminData.value)
  607. })
  608. </script>
  609. <style scoped lang="scss">
  610. .pagination {
  611. display: flex;
  612. margin-top: 1vh;
  613. }
  614. /* 搜索的卡片样式 */
  615. .card1 {
  616. background: #F3FAFE;
  617. }
  618. /* 表单的卡片样式 */
  619. .card2 {
  620. background: #E7F4FD;
  621. }
  622. /* 自定义按钮组布局 */
  623. .custom-button-group {
  624. display: flex;
  625. margin-bottom: 16px;
  626. }
  627. /* 自定义按钮样式 */
  628. :deep(.el-button.custom-tab-button) {
  629. border-radius: 4px;
  630. transition: all 0.3s ease;
  631. }
  632. /* 激活状态的按钮样式 */
  633. :deep(.el-button.custom-tab-button.el-button--primary) {
  634. background-color: #2741DE !important;
  635. border-color: #2741DE !important;
  636. color: #F3FAFE !important;
  637. }
  638. /* 悬停效果 */
  639. :deep(.el-button.custom-tab-button:hover:not(.is-disabled)) {
  640. opacity: 0.8;
  641. }
  642. /* 充值新币总数等等 */
  643. .goldStatistics {
  644. margin-left: 1vw;
  645. margin-bottom: 1vh;
  646. color: #000000;
  647. font-family: "PingFang SC";
  648. font-size: 16px;
  649. font-style: normal;
  650. font-weight: 700;
  651. line-height: 20px;
  652. }
  653. /* 表头/表体 wrapper 与 table body 单元格 */
  654. :deep(.el-table__header-wrapper),
  655. :deep(.el-table__body-wrapper),
  656. :deep(.el-table__cell),
  657. /* 表格 */
  658. :deep(.el-table__body td) {
  659. background-color: #F3FAFE !important;
  660. }
  661. /* 表头 */
  662. :deep(.el-table__header th) {
  663. background-color: #F3FAFE !important;
  664. }
  665. /* 鼠标悬停 */
  666. :deep(.el-table__row:hover > .el-table__cell) {
  667. background-color: #E5EBFE !important;
  668. }
  669. .select {
  670. display: flex;
  671. .selectRow {
  672. width: 17vw;
  673. display: flex;
  674. align-items: center;
  675. justify-content: center;
  676. padding: 0 0.5vw;
  677. .text {
  678. width: 5vw;
  679. font-size: 15px;
  680. }
  681. .selectContent {
  682. flex: 1;
  683. }
  684. }
  685. }
  686. </style>