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.

733 lines
23 KiB

7 months ago
7 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
5 months ago
5 months ago
5 months ago
6 months ago
5 months ago
5 months ago
5 months ago
6 months ago
5 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
5 months ago
5 months ago
5 months ago
  1. <script setup>
  2. import {computed, onMounted, ref, watch, nextTick} from 'vue'
  3. import {dayjs, ElMessage} from 'element-plus'
  4. import request from '@/util/http.js'
  5. import API from '@/util/http.js'
  6. import moment from 'moment'
  7. import {useAdminStore} from "@/store/index.js";
  8. import {storeToRefs} from "pinia";
  9. // 国际化
  10. import { useI18n } from 'vue-i18n';
  11. const { t } = useI18n();
  12. const adminStore = useAdminStore();
  13. const {flag} = storeToRefs(adminStore);
  14. // 监听全局flag状态变化
  15. watch(flag, (newFlag, oldFlag) => {
  16. // 当flag状态改变时,重新发送请求
  17. if (newFlag !== oldFlag) {
  18. selectLiveBy()
  19. }
  20. })
  21. // 之后整理一下
  22. /*
  23. ====================工具方法==============================
  24. */
  25. const defaultTime = [
  26. new Date(2000, 1, 1, 0, 0, 0),
  27. new Date(2000, 2, 1, 23, 59, 59),
  28. ]
  29. const format3 = (num) => {
  30. // 每三位添加逗号
  31. return num.toLocaleString('en-US')
  32. }
  33. // 时间格式化
  34. const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
  35. /*
  36. ====================数据=================================
  37. */
  38. //这是获取用户信息的接口
  39. const adminData = ref({})
  40. // 充值明细表格
  41. const tableData = ref([])
  42. const tableRef = ref(null)
  43. const scrollTableTop = () => {
  44. tableRef.value?.setScrollTop?.(0)
  45. }
  46. // 搜索beanConsumeLive 表单
  47. const beanConsumeLive = ref({
  48. jwcode: null,
  49. dept: "",
  50. type: "",
  51. gift: "",
  52. liveChannel: "",
  53. liveName: "",
  54. startTime: '',
  55. endTime: '',
  56. sortField: '',
  57. sortOrder: ''
  58. })
  59. // 礼物列表
  60. const gifts = ref([])
  61. // 获取礼物列表的方法
  62. const getGift = async function () {
  63. try {
  64. const result = await request({
  65. url: '/beanConsume/getLiveGift', // todo 换成实际接口地址
  66. data: {account: adminData.value.account}
  67. })
  68. console.log('请求礼物列表成功', result)
  69. // 存储礼物数据
  70. gifts.value = result.data
  71. console.log('礼物数据', gifts.value)
  72. } catch (error) {
  73. console.log('请求礼物列表失败', error)
  74. ElMessage({
  75. type: 'error',
  76. message: t('elmessage.getGiftListFailed')
  77. })
  78. }
  79. }
  80. // 频道列表
  81. const channels = ref([])
  82. // 获取频道列表的方法
  83. const getChannel = async function () {
  84. try {
  85. const result = await request({
  86. url: '/beanConsume/getLiveChannel', // todo 换成实际接口地址
  87. data: {account: adminData.value.account}
  88. })
  89. console.log('请求频道列表成功', result)
  90. // 存储频道数据
  91. channels.value = result.data
  92. console.log('频道数据', channels.value)
  93. } catch (error) {
  94. console.log('请求频道列表失败', error)
  95. ElMessage({
  96. type: 'error',
  97. message: t('elmessage.getChannelListFailed')
  98. })
  99. }
  100. }
  101. // 抽离类型选项到响应式数组
  102. const consumeTypes = ref([
  103. {label: t('consume.consumeTypes.1'), value: 1},
  104. {label: t('consume.consumeTypes.2'), value: 2},
  105. {label: t('consume.consumeTypes.3'), value: 3},
  106. {label: t('consume.consumeTypes.4'), value: 4},
  107. {label: t('consume.consumeTypes.5'), value: 5},
  108. {label: t('consume.consumeTypes.6'), value: 6}
  109. ])
  110. // 处理类型选择变化
  111. const handleTypeChange = (value) => {
  112. if (value !== 1) {
  113. beanConsumeLive.value.gift = ''
  114. }
  115. }
  116. //------------------------
  117. // 标记当前激活的时间范围按钮
  118. const activeTimeRange = ref('')
  119. // 日期选择器变化时清除按钮激活状态
  120. const handleDatePickerChange = () => {
  121. activeTimeRange.value = ''
  122. }
  123. // 搜索对象
  124. const getObj = ref({
  125. pageNum: 1,
  126. pageSize: 50
  127. })
  128. //分页总条目
  129. const total = ref(100)
  130. // 搜索对象时间
  131. const getTime = ref({
  132. startTime: '',
  133. endTime: ''
  134. })
  135. // 搜索地区列表
  136. const dept = ref([])
  137. // 获取地区列表的方法
  138. const getDept = async function () {
  139. try {
  140. // 发送请求获取地区列表
  141. const result = await request({
  142. // url: '/general/dept',
  143. url: '/beanConsume/getDept', // todo 换成实际接口地址
  144. data: {account: adminData.value.account}
  145. })
  146. console.log('请求地区列表成功', result)
  147. // 存储地区数据
  148. dept.value = result.data
  149. console.log('地区数据', dept.value)
  150. } catch (error) {
  151. console.log('请求地区列表失败', error)
  152. ElMessage({
  153. type: 'error',
  154. message: t('elmessage.getRegionListFailed')
  155. })
  156. }
  157. }
  158. // 新增排序字段和排序方式
  159. const sortField = ref('')
  160. const sortOrder = ref('')
  161. // 合计数
  162. const permanentBean = ref(0)
  163. const freeBean = ref(0)
  164. const totalNum = ref(0)
  165. /*
  166. ====================方法=================================
  167. */
  168. // 获取登录用户信息
  169. const getAdminData = async function () {
  170. try {
  171. const result = await request({
  172. url: '/admin/userinfo',
  173. data: {}
  174. })
  175. adminData.value = result
  176. console.log('请求成功', result)
  177. console.log('用户信息', adminData.value)
  178. } catch (error) {
  179. console.log('请求失败', error)
  180. }
  181. }
  182. const selectLiveBy = async function (val) {
  183. try {
  184. // 搜索参数页码赋值
  185. if (typeof val === 'number') {
  186. getObj.value.pageNum = val
  187. }
  188. // 搜索参数时间赋值
  189. // 修复时间范围处理
  190. if (Array.isArray(getTime.value) && getTime.value.length === 2) {
  191. beanConsumeLive.value.startTime = formatTime(getTime.value[0])
  192. beanConsumeLive.value.endTime = formatTime(getTime.value[1])
  193. } else {
  194. beanConsumeLive.value.startTime = ''
  195. beanConsumeLive.value.endTime = ''
  196. }
  197. // 设置排序参数
  198. beanConsumeLive.value.sortField = sortField.value
  199. beanConsumeLive.value.sortOrder = sortOrder.value
  200. console.log('搜索参数_时间', beanConsumeLive.value.startTime)
  201. console.log('搜索参数1', getObj.value)
  202. console.log('搜索参数2', beanConsumeLive.value)
  203. // 发送POST请求
  204. const result = await request({
  205. url: '/beanConsume/selectLiveBy',
  206. data: {
  207. pageNum: getObj.value.pageNum,
  208. pageSize: getObj.value.pageSize,
  209. beanConsumeLive: {
  210. ...beanConsumeLive.value,
  211. jwcode: beanConsumeLive.value.jwcode ? String(beanConsumeLive.value.jwcode) : '',
  212. dept: beanConsumeLive.value.dept || '',
  213. type: beanConsumeLive.value.type || '',
  214. gift: beanConsumeLive.value.gift || '',
  215. beanNum: beanConsumeLive.value.beanNum || '',
  216. isBackpack: beanConsumeLive.value.isBackpack || '',
  217. liveChannel: beanConsumeLive.value.liveChannel || '',
  218. liveName: beanConsumeLive.value.liveName || '',
  219. startTime: beanConsumeLive.value.startTime || '',
  220. endTime: beanConsumeLive.value.endTime || '',
  221. sortField: beanConsumeLive.value.sortField || 'consumeTime',
  222. sortOrder: beanConsumeLive.value.sortOrder || 'desc',
  223. flag: flag.value,
  224. roleId: adminData.value.roleId
  225. }
  226. }
  227. })
  228. console.log('请求成功2', sortField)
  229. console.log('接口响应结果', result); // 打印接口响应结果
  230. if (result.code === 200 && result.data && result.data.list) {
  231. tableData.value = result.data.list;
  232. await nextTick()
  233. scrollTableTop()
  234. total.value = result.data.total;
  235. }
  236. // 复制一份 beanConsumeLive.value 并设置固定的 payType 值 1是直播
  237. const sumConsumeParams = {
  238. payType: 1, // 固定传入 payType 值 1 是直播
  239. beanConsumeLive: {
  240. ...beanConsumeLive.value,
  241. roleId: adminData.value.roleId,
  242. flag: flag.value
  243. }
  244. };
  245. // 发送 POST 请求获取合计数
  246. const resultTotalGold = await request({
  247. url: '/beanConsume/sumConsumeGold',
  248. data: sumConsumeParams
  249. });
  250. console.log("总计", resultTotalGold);
  251. const data = resultTotalGold.data || resultTotalGold;
  252. console.log('请求成功1', resultTotalGold.data) //undifined
  253. console.log('permanentBean1', data.permanentBean)
  254. // 返回字段为 permanentBean、freeBean、totalNum
  255. permanentBean.value = Number(data.permanentBean) || 0;
  256. freeBean.value = Number(data.freeBean) || 0;
  257. totalNum.value = Number(data.totalNum) || 0;
  258. // 存储分页总数
  259. total.value = result.data.total
  260. console.log('total', total.value)
  261. } catch (error) {
  262. console.log('请求失败', error)
  263. }
  264. }
  265. // 搜索
  266. const search = function () {
  267. getObj.value.pageNum = 1
  268. if (beanConsumeLive.value.jwcode) {
  269. const numRef = /^\d{1,9}$/;
  270. if (!numRef.test(beanConsumeLive.value.jwcode)) {
  271. ElMessage.error(t('elmessage.checkJwcodeFormat'))
  272. return
  273. }
  274. }
  275. selectLiveBy()
  276. }
  277. // 重置
  278. const reset = function () {
  279. console.log('直播的重置')
  280. beanConsumeLive.value.jwcode = null
  281. beanConsumeLive.value.type = ''
  282. beanConsumeLive.value.gift = ''
  283. beanConsumeLive.value.liveChannel = ''
  284. beanConsumeLive.value.liveName = ''
  285. beanConsumeLive.value.dept = ''
  286. beanConsumeLive.value.startTime = ''
  287. beanConsumeLive.value.endTime = ''
  288. sortField.value = ''
  289. sortOrder.value = ''
  290. getTime.value = {}
  291. activeTimeRange.value = '' // 清除激活状态
  292. // 重置页码
  293. getObj.value.pageNum = 1
  294. // 点完重置后,重新请求数据
  295. selectLiveBy()
  296. console.log(' beanConsumeLive', beanConsumeLive.value)
  297. }
  298. // 今天
  299. const getToday = function () {
  300. const today = dayjs()
  301. const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
  302. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  303. getTime.value = [startTime, endTime]
  304. console.log('getTime', getTime.value)
  305. activeTimeRange.value = 'today' // 标记当前激活状态
  306. selectLiveBy()
  307. }
  308. // 昨天
  309. const getYesterday = function () {
  310. const today = dayjs()
  311. const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  312. const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
  313. getTime.value = [startTime, endTime]
  314. console.log('getTime', getTime.value)
  315. activeTimeRange.value = 'yesterday' // 标记当前激活状态
  316. selectLiveBy()
  317. }
  318. // 近7天
  319. const get7Days = function () {
  320. const today = dayjs()
  321. const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  322. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  323. getTime.value = [startTime, endTime]
  324. console.log('getTime', getTime.value)
  325. activeTimeRange.value = '7days' // 标记当前激活状态
  326. selectLiveBy()
  327. }
  328. // 处理排序事件
  329. const handleSortChange = (column) => {
  330. console.log('排序字段:', column.prop)
  331. console.log('排序方式:', column.order)
  332. if (column.prop === 'beanNum') {
  333. sortField.value = 'beanNum'
  334. } else if (column.prop === 'consumeTime') {
  335. sortField.value = 'consumeTime'
  336. } else if (column.prop === 'buyBean') {
  337. sortField.value = 'buyBean'
  338. } else if (column.prop === 'freeBean') {
  339. sortField.value = 'freeBean'
  340. }
  341. sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
  342. selectLiveBy()
  343. }
  344. const handlePageSizeChange = function (val) {
  345. getObj.value.pageSize = val
  346. selectLiveBy()
  347. }
  348. const handleCurrentChange = function (val) {
  349. getObj.value.pageNum = val
  350. selectLiveBy()
  351. }
  352. /*
  353. ====================计算属性=================================
  354. */
  355. // 计算总金币数
  356. // const totalBean = computed(() => permanentBean.value + freeBean.value)
  357. /*
  358. ====================监听=================================
  359. */
  360. /*
  361. ====================挂载=================================
  362. */
  363. onMounted(async function () {
  364. await getAdminData()
  365. await selectLiveBy()
  366. await getDept()
  367. await getGift()
  368. await getChannel()
  369. })
  370. const exportExcel = async function () {
  371. console.log('1')
  372. const params = {
  373. ...getObj.value,
  374. "beanConsumeLive": {
  375. ...beanConsumeLive.value,
  376. jwcode: beanConsumeLive.value.jwcode ? String(beanConsumeLive.value.jwcode) : '',
  377. dept: beanConsumeLive.value.dept || '',
  378. type: beanConsumeLive.value.type || '',
  379. gift: beanConsumeLive.value.gift || '',
  380. liveChannel: beanConsumeLive.value.liveChannel || '',
  381. liveName: beanConsumeLive.value.liveName || '',
  382. startTime: beanConsumeLive.value.startTime || '',
  383. endTime: beanConsumeLive.value.endTime || '',
  384. sortField: sortField.value || 'consumeTime',
  385. sortOrder: sortOrder.value || 'desc',
  386. roleId: adminData.value.roleId,
  387. flag: flag.value,
  388. }
  389. }
  390. // 打印请求参数,方便调试
  391. console.log('导出请求参数:', params);
  392. try {
  393. console.log('2')
  394. const res = await API({url: '/export/exportLive', data: params});
  395. console.log('导出请求响应:', res);
  396. if (res.code === 200) {
  397. ElMessage.success(t('elmessage.exportSuccess'));
  398. } else {
  399. ElMessage.error(res.message || t('elmessage.exportFailed'));
  400. }
  401. } catch (error) {
  402. console.error('导出请求出错:', error);
  403. ElMessage.error(t('elmessage.exportFailed'));
  404. }
  405. }
  406. const exportListVisible = ref(false)
  407. // 打开导出列表弹窗
  408. const openExportList = () => {
  409. getExportList()
  410. exportListVisible.value = true
  411. }
  412. // 导出列表数据
  413. const exportList = ref([])
  414. // 导出列表加载状态
  415. const exportListLoading = ref(false)
  416. // 获取导出列表
  417. const getExportList = async () => {
  418. exportListLoading.value = true
  419. try {
  420. const result = await API({url: '/export/export'})
  421. if (result.code === 200) {
  422. const filteredData = result.data.filter(item => {
  423. return item.type === 6; //6是直播
  424. });
  425. exportList.value = filteredData
  426. } else {
  427. ElMessage.error(result.msg || t('elmessage.getExportListError'))
  428. }
  429. } catch (error) {
  430. console.error('获取导出列表出错:', error)
  431. ElMessage.error(t('elmessage.getExportListError'))
  432. } finally {
  433. exportListLoading.value = false
  434. }
  435. }
  436. // 下载导出文件
  437. const downloadExportFile = (item) => {
  438. if (item.state === 2) {
  439. const link = document.createElement('a')
  440. link.href = item.url
  441. link.download = item.fileName
  442. link.click()
  443. } else {
  444. ElMessage.warning(t('elmessage.exportingInProgress'))
  445. }
  446. }
  447. //根据状态返回对应的标签类型
  448. const getTagType = (state) => {
  449. switch (state) {
  450. case 0:
  451. return 'info';
  452. case 1:
  453. return 'primary';
  454. case 2:
  455. return 'success';
  456. case 3:
  457. return 'danger';
  458. default:
  459. return 'info';
  460. }
  461. }
  462. //根据状态返回对应的标签文案
  463. const getTagText = (state) => {
  464. switch (state) {
  465. case 0:
  466. return t('elmessage.pendingExecution');
  467. case 1:
  468. return t('elmessage.executing');
  469. case 2:
  470. return t('elmessage.executed');
  471. case 3:
  472. return t('elmessage.errorExecution');
  473. default:
  474. return t('elmessage.unknownStatus');
  475. }
  476. }
  477. </script>
  478. <template>
  479. <el-card class="card1" style="margin-bottom: 0.5vh;">
  480. <el-col style="margin-bottom: 1vh">
  481. <div class="select">
  482. <div class="selectRow">
  483. <el-text class="text">{{ t('common.jwcode') }}</el-text>
  484. <el-input class="selectContent" v-model="beanConsumeLive.jwcode" :placeholder="t('common.jwcodePlaceholder')" clearable/>
  485. </div>
  486. <div class="selectRow">
  487. <el-text class="text">{{ t('common.market') }}</el-text>
  488. <el-select class="selectContent" v-model="beanConsumeLive.dept" :placeholder="t('common.marketPlaceholder')" clearable>
  489. <el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item"/>
  490. </el-select>
  491. </div>
  492. <div class="selectRow" style="width: 14vw;">
  493. <el-text class="text">{{ t('common.giftName') }}</el-text>
  494. <el-select class="selectContent" v-model="beanConsumeLive.gift" :placeholder="t('common.giftNamePlaceholder')" clearable
  495. filterable
  496. allow-create default-first-option>
  497. <el-option v-for="(item, index) in gifts" :key="index" :label="item" :value="item"/>
  498. </el-select>
  499. </div>
  500. <div class="selectRow" style="min-width: 12vw;">
  501. <el-text class="textB" size="large">{{ t('common.channel') }}</el-text>
  502. <el-select class="selectContent" v-model="beanConsumeLive.liveChannel" :placeholder="t('common.channelPlaceholder')" clearable
  503. filterable allow-create default-first-option>
  504. <el-option v-for="(item, index) in channels" :key="index" :label="item" :value="item"/>
  505. </el-select>
  506. </div>
  507. <div class="selectRow" style="min-width: 12vw;">
  508. <el-text class="textB" size="large">{{ t('common.liveRoom') }}</el-text>
  509. <el-input class="selectContent" v-model="beanConsumeLive.liveName" :placeholder="t('common.liveRoomPlaceholder')" clearable/>
  510. </div>
  511. </div>
  512. </el-col>
  513. <el-col>
  514. <div class="select">
  515. <div class="selectRow" style="width: 35.4vw;">
  516. <el-text class="text">{{ t('common.consumetime') }}</el-text>
  517. <el-date-picker class="selectContent" v-model="getTime" type="datetimerange" :range-separator="t('common.to')"
  518. :start-placeholder="t('common.startTime')" :end-placeholder="t('common.endTime')" style="margin-right:1vw;width:480px"
  519. @change="handleDatePickerChange" :default-time="defaultTime"/>
  520. <div v-if="false">
  521. <el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
  522. <el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
  523. <el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
  524. </div>
  525. </div>
  526. <div class="selectRow" style="justify-content: flex-start;">
  527. <el-button type="primary" @click="search()">{{ t('common.search') }}</el-button>
  528. <el-button type="primary" @click="exportExcel()">{{ t('common.exportExcel') }}</el-button>
  529. <el-button type="primary" @click="openExportList">{{ t('common.viewExportList') }}</el-button>
  530. <el-button type="success" @click="reset()">{{ t('common.reset') }}</el-button>
  531. </div>
  532. </div>
  533. </el-col>
  534. </el-card>
  535. <el-card class="card2">
  536. <div class="goldStatistics">
  537. {{ t('common.totalGoldBean') }}{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
  538. {{ t('common.payGoldBean') }}{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
  539. {{ t('common.freeGoldBean') }}{{ format3(Math.abs(freeBean)) }}
  540. </div>
  541. <div style="overflow-y: auto">
  542. <el-table ref="tableRef" :data="tableData" style="width: 82vw" height="65vh" @sort-change="handleSortChange"
  543. :row-style="{ height: '50px' }">
  544. <el-table-column type="index" :label="t('common_list.id')" width="80px" fixed="left">
  545. <template #default="scope">
  546. <span>{{
  547. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  548. }}</span>
  549. </template>
  550. </el-table-column>
  551. <!-- 固定姓名列 -->
  552. <el-table-column prop="name" :label="t('common_list.name')" width="150px" fixed="left" show-overflow-tooltip/>
  553. <!-- 固定精网号列 -->
  554. <el-table-column prop="jwcode" :label="t('common_list.jwcode')" width="110px" fixed="left"/>
  555. <el-table-column prop="dept" :label="t('common_list.market')" width="120px"/>
  556. <el-table-column prop="gift" :label="t('common_list.gift')" width="150px">
  557. </el-table-column>
  558. <el-table-column prop="beanNum" :label="t('common_list.beanNum')" sortable="custom" width="120px"/>
  559. <el-table-column prop="isBackpack" :label="t('common_list.isBackpack')" width="120px">
  560. <template #default="scope">
  561. {{ scope.row.isBackpack == 1 ? t('common_list.yes') : t('common_list.no') }}
  562. </template>
  563. </el-table-column>
  564. <el-table-column prop="buyBean" :label="t('common_list.permanentBean')" sortable="custom" width="170px"/>
  565. <el-table-column prop="freeBean" :label="t('common_list.freeBean')" sortable="custom" width="130px"/>
  566. <el-table-column prop="liveChannel" :label="t('common_list.channel')" width="120px" show-overflow-tooltip/>
  567. <el-table-column prop="liveName" :label="t('common_list.liveRoomName')" width="160px" show-overflow-tooltip/>
  568. <el-table-column prop="consumeTime" :label="t('common_list.consumetime')" sortable="custom" width="190px"/>
  569. </el-table>
  570. </div>
  571. <el-pagination background :current-page="getObj.pageNum" :page-size="getObj.pageSize"
  572. :page-sizes="[5, 10, 20, 50, 100]" style="margin-top: 20px;"
  573. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
  574. @current-change="handleCurrentChange"></el-pagination>
  575. </el-card>
  576. <!-- 导出弹窗 -->
  577. <el-dialog v-model="exportListVisible" :title="t('common_export.exportList')" width="80%">
  578. <el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
  579. <el-table-column prop="fileName" :label="t('common_export.fileName')"/>
  580. <el-table-column prop="state" :label="t('common_export.status')">
  581. <template #default="scope">
  582. <el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'">
  583. {{ getTagText(scope.row.state) }}
  584. </el-tag>
  585. </template>
  586. </el-table-column>
  587. <el-table-column prop="createTime" :label="t('common_export.createTime')">
  588. <template #default="scope">
  589. {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
  590. </template>
  591. </el-table-column>
  592. <el-table-column :label="t('common_export.operation')">
  593. <template #default="scope">
  594. <el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
  595. :disabled="scope.row.state !== 2">
  596. {{ t('common_export.download') }}
  597. </el-button>
  598. </template>
  599. </el-table-column>
  600. </el-table>
  601. <template #footer>
  602. <div class="dialog-footer">
  603. <el-button text @click="exportListVisible = false">{{ t('common_export.close') }}</el-button>
  604. </div>
  605. </template>
  606. </el-dialog>
  607. </template>
  608. <style scoped lang="scss">
  609. // 搜索的卡片样式
  610. .card1 {
  611. background: #F3FAFE;
  612. }
  613. // 表单的卡片样式
  614. .card2 {
  615. background: #E7F4FD;
  616. }
  617. // 新币总数等等
  618. .goldStatistics {
  619. margin-left: 1vw;
  620. margin-bottom: 1vh;
  621. color: #000000;
  622. font-family: "PingFang SC";
  623. font-size: 16px;
  624. font-style: normal;
  625. font-weight: 700;
  626. line-height: 20px;
  627. }
  628. // 表头背景等
  629. :deep(.el-table__header-wrapper),
  630. :deep(.el-table__body-wrapper),
  631. :deep(.el-table__cell),
  632. /* 表格 */
  633. :deep(.el-table__body td) {
  634. background-color: #F3FAFE !important;
  635. }
  636. /* 表头 */
  637. :deep(.el-table__header th) {
  638. background-color: #F3FAFE !important;
  639. }
  640. /* 鼠标悬停 */
  641. :deep(.el-table__row:hover > .el-table__cell) {
  642. background-color: #E5EBFE !important;
  643. }
  644. .pagination {
  645. display: flex;
  646. margin-top: 20px;
  647. }
  648. /** 搜索的样式 */
  649. .select {
  650. display: flex;
  651. .selectRow {
  652. width: 14.7vw;
  653. display: flex;
  654. align-items: center;
  655. justify-content: center;
  656. padding: 0 0.5vw;
  657. .text {
  658. width: 5.3vw;
  659. font-size: 15px;
  660. }
  661. .selectContent {
  662. flex: 1;
  663. }
  664. }
  665. }
  666. </style>