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.

856 lines
25 KiB

6 months ago
12 hours ago
5 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
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
12 hours ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 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
3 months ago
3 months ago
  1. <script setup>
  2. import { computed, onMounted, ref, watch } 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 { reverseMarketMapping } from "@/utils/marketMap.js";
  8. import { storeToRefs } from 'pinia'
  9. import { useAdminStore } from '@/store/index.js'
  10. const adminStore = useAdminStore()
  11. const { menuTree, flag } = storeToRefs(adminStore)
  12. // 国际化
  13. import { useI18n } from 'vue-i18n';
  14. const { t } = useI18n();
  15. // 之后整理一下
  16. // 监听全局flag状态变化
  17. watch(flag, (newFlag, oldFlag) => {
  18. if(newFlag !== oldFlag) {
  19. ConsumeSelectBy()
  20. }
  21. })
  22. /*
  23. ====================工具方法==============================
  24. */
  25. const trimJwCode = () => {
  26. if (consumeUser.value.jwcode) {
  27. consumeUser.value.jwcode = consumeUser.value.jwcode.replace(/\s/g, '');
  28. }
  29. }
  30. const format3 = (num) => {
  31. if (!num) return '0';
  32. const parts = Number(num).toFixed(2).split('.');
  33. // 添加逗号
  34. parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  35. return parts.join('.');
  36. }
  37. //无法选择的时间
  38. const disabledDate = (time) => {
  39. const limitDate = new Date(2025, 0, 1);
  40. return time.getTime() < limitDate.getTime();
  41. }
  42. // 时间格式化
  43. const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
  44. const defaultTime = [
  45. new Date(2000, 1, 1, 0, 0, 0),
  46. new Date(2000, 2, 1, 23, 59, 59),
  47. ]
  48. /*
  49. ====================数据=================================
  50. */
  51. // 新增复选框状态,默认勾选
  52. // const showEmployeeData = ref(false)
  53. //这是获取用户信息的接口
  54. const adminData = ref({})
  55. // 充值明细表格
  56. const tableData = ref([])
  57. // 搜索consumeUser 表单
  58. const consumeUser = ref({
  59. jwcode: null,
  60. payPlatform: "",
  61. market: "",
  62. startTime: '',
  63. endTime: '',
  64. goodsName: '',
  65. })
  66. // 标记当前激活的时间范围按钮
  67. const activeTimeRange = ref('')
  68. // 日期选择器变化时清除按钮激活状态
  69. const handleDatePickerChange = () => {
  70. activeTimeRange.value = ''
  71. }
  72. // 搜索对象
  73. const getObj = ref({
  74. pageNum: 1,
  75. pageSize: 50
  76. })
  77. //分页总条目
  78. const total = ref(100)
  79. // 搜索对象时间
  80. const getTime = ref({
  81. startTime: '',
  82. endTime: ''
  83. })
  84. // 搜索活动列表
  85. const activity = ref([])
  86. // 搜索地区列表
  87. const market = ref("")
  88. // 新增排序字段和排序方式
  89. const sortField = ref('')
  90. const sortOrder = ref('')
  91. //
  92. const consumeStatus = [
  93. {
  94. value: '1',
  95. label: '正常'
  96. },
  97. {
  98. value: '2',
  99. label: '已退款'
  100. },
  101. ]
  102. // 消费平台选项
  103. const consumePlatform = [
  104. {
  105. value: '金币系统',
  106. label: '金币系统'
  107. },
  108. {
  109. value: 'HomilyChart',
  110. label: 'HomilyChart'
  111. },
  112. {
  113. value: 'HomilyLink',
  114. label: 'HomilyLink'
  115. },
  116. {
  117. value: 'ERP',
  118. label: 'ERP'
  119. },
  120. {
  121. value: '其他',
  122. label: '其他'
  123. },
  124. {
  125. value: '初始化金币',
  126. label: '初始化金币'
  127. },
  128. ]
  129. // 合计数的显示数据
  130. const tableDataTotal = ref({})
  131. const permanentGold = ref(0)
  132. const freeGold = ref(0)
  133. const taskGold = ref(0)
  134. const totalGold = ref(0)
  135. // 定义响应式变量存储金币合计数
  136. const permanentGolds = ref(0)
  137. const freeGolds = ref(0)
  138. const taskGolds = ref(0)
  139. // 查询商品的接口的表单
  140. const goods = ref([])
  141. const totalGoldSearch = ref({
  142. jwcode: null,
  143. payPlatform: "",
  144. market: "",
  145. startTime: "",
  146. endTime: "",
  147. goodsName: ""
  148. })
  149. /*
  150. ====================方法=================================
  151. */
  152. // 获取登录用户信息
  153. const getAdminData = async function () {
  154. try {
  155. const result = await request({
  156. url: '/admin/userinfo',
  157. data: {}
  158. })
  159. adminData.value = result
  160. console.log('请求成功', result)
  161. console.log('用户信息', adminData.value)
  162. } catch (error) {
  163. console.log('请求失败', error)
  164. }
  165. }
  166. const ConsumeSelectBy = async function (val) {
  167. try {
  168. // 搜索参数页码赋值
  169. if (typeof val === 'number') {
  170. getObj.value.pageNum = val
  171. }
  172. // 搜索参数时间赋值
  173. if (getTime.value != null) {
  174. if (getTime.value.startTime != '' && getTime.value.endTime != '') {
  175. consumeUser.value.startTime = formatTime(getTime.value[0])
  176. consumeUser.value.endTime = formatTime(getTime.value[1])
  177. }
  178. } else {
  179. consumeUser.value.startTime = ''
  180. consumeUser.value.endTime = ''
  181. }
  182. consumeUser.value.sortField = sortField.value
  183. consumeUser.value.sortOrder = sortOrder.value
  184. console.log('搜索参数_时间', consumeUser.value.startTime)
  185. console.log('搜索参数1', getObj.value)
  186. console.log('搜索参数2', consumeUser.value)
  187. // // 发送POST请求
  188. // if (consumeUser.value.market === '9' || consumeUser.value.market === '9999') {
  189. // consumeUser.value.market = '';
  190. // }
  191. if (consumeUser.value.jwcode) {
  192. // 纯数字
  193. const numberRegex = /^\d{1,9}$/;
  194. // 检查是否不是数字
  195. if (!numberRegex.test(consumeUser.value.jwcode)) {
  196. ElMessage.error(t('elmessage.checkJwcodeFormat'))
  197. return
  198. }
  199. }
  200. const result = await request({
  201. url: '/consume/selectBy',
  202. data: {
  203. pageNum: getObj.value.pageNum,
  204. pageSize: getObj.value.pageSize,
  205. consumeUser: {
  206. ...consumeUser.value,
  207. sortField: sortField.value,
  208. sortOrder: sortOrder.value,
  209. flag: flag.value // 新增 flag 参数
  210. }
  211. }
  212. })
  213. console.log('请求成功2', sortField)
  214. // 合计数的接口
  215. // 复制一份 detail.value 并移除排序字段和排序方式
  216. const detailWithoutSort = { ...consumeUser.value, flag: flag.value }
  217. delete detailWithoutSort.sortField
  218. delete detailWithoutSort.sortOrder
  219. // 赋值
  220. totalGoldSearch.value.startTime = consumeUser.value.startTime
  221. totalGoldSearch.value.endTime = consumeUser.value.endTime
  222. totalGoldSearch.value.payPlatform = consumeUser.value.payPlatform
  223. totalGoldSearch.value.market = consumeUser.value.market
  224. totalGoldSearch.value.goodsName = consumeUser.value.goodsName
  225. totalGoldSearch.value.jwcode = consumeUser.value.jwcode
  226. totalGoldSearch.value.flag = flag.value // 新增 flag 参数
  227. //
  228. const resultTotalGold = await request({
  229. // url: '/consume/statsGold',
  230. url: '/consume/statsGold',
  231. data: totalGoldSearch.value
  232. })
  233. console.log("总计", resultTotalGold)
  234. if (resultTotalGold.code === 200 && resultTotalGold.data) {
  235. const data = resultTotalGold.data
  236. console.log('获取到的金币数据:', data)
  237. permanentGolds.value = Number(data.permanentGolds) || 0
  238. freeGolds.value = Number(data.freeGolds) || 0
  239. taskGolds.value = Number(data.taskGolds) || 0
  240. }
  241. // 存储表格数据
  242. tableData.value = result.data.list
  243. tableDataTotal.value = resultTotalGold.data
  244. if (resultTotalGold.data == null) {
  245. console.log('请求成功2', resultTotalGold)
  246. // 这是啥东西啊
  247. tableDataTotal.value = resultTotalGold.data
  248. }
  249. const sumGoldList = tableData.value.map(item => item.sumGold);
  250. console.log("sumGold", sumGoldList); // 输出包含所有 sumGold 值的数组
  251. console.log('@@@@@@@@@@tableDataT', tableDataTotal.value.list)
  252. // totalGold.value = tableData.value.sum
  253. // // 修改为保留两位小数
  254. // permanentGold.value = parseFloat(
  255. // (tableDataTotal.value.list.sumGold ).toFixed(2)
  256. // )
  257. // freeGold.value = parseFloat(
  258. // (tableDataTotal.value.sumFcion ).toFixed(2)
  259. // )
  260. // taskGold.value = parseFloat(
  261. // (tableDataTotal.value.sumTcion ).toFixed(2)
  262. // )
  263. // totalGold.value = parseFloat(
  264. // (tableDataTotal.value.sumcion ).toFixed(2)
  265. // )
  266. console.log('tableData', tableData.value)
  267. // 存储分页总数
  268. total.value = result.data.total
  269. console.log('total', total.value)
  270. } catch (error) {
  271. console.log('请求失败', error)
  272. // 在这里可以处理错误逻辑,比如显示错误提示等
  273. }
  274. }
  275. // 搜索
  276. const search = function () {
  277. trimJwCode()
  278. getObj.value.pageNum = 1
  279. ConsumeSelectBy()
  280. }
  281. // 重置
  282. const reset = function () {
  283. console.log('兄弟,你点了重置')
  284. consumeUser.value.goodsName = ''
  285. consumeUser.value.market = ""
  286. consumeUser.value.payPlatform = ''
  287. consumeUser.value.startTime = ''
  288. consumeUser.value.endTime = ''
  289. consumeUser.value.jwcode = null
  290. sortField.value = ''
  291. sortOrder.value = ''
  292. getTime.value = {}
  293. activeTimeRange.value = '' // 清除激活状态
  294. selectedMarketPath.value = []
  295. // 重置页码
  296. getObj.value.pageNum = 1
  297. // 点完重置后,重新请求数据
  298. ConsumeSelectBy()
  299. console.log('consumeUser', consumeUser.value)
  300. }
  301. // 今天
  302. const getToday = function () {
  303. const today = dayjs()
  304. const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
  305. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  306. getTime.value = [startTime, endTime]
  307. console.log('getTime', getTime.value)
  308. activeTimeRange.value = 'today' // 标记当前激活状态
  309. ConsumeSelectBy()
  310. }
  311. // 昨天
  312. const getYesterday = function () {
  313. const today = dayjs()
  314. const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  315. const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
  316. getTime.value = [startTime, endTime]
  317. console.log('getTime', getTime.value)
  318. activeTimeRange.value = 'yesterday' // 标记当前激活状态
  319. ConsumeSelectBy()
  320. }
  321. // 近7天
  322. const get7Days = function () {
  323. const today = dayjs()
  324. const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  325. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  326. getTime.value = [startTime, endTime]
  327. console.log('getTime', getTime.value)
  328. activeTimeRange.value = '7days' // 标记当前激活状态
  329. ConsumeSelectBy()
  330. }
  331. // 获取商品列表
  332. const getGoods = async function () {
  333. try {
  334. // 发送POST请求
  335. const result = await request({
  336. url: '/general/goods',
  337. data: {}
  338. })
  339. // 验证数据格式
  340. if (result.data && Array.isArray(result.data)) {
  341. goods.value = result.data
  342. console.log('商品数据加载成功', goods.value)
  343. } else {
  344. console.error('返回数据格式不正确', result)
  345. // 可以在这里设置默认值或显示错误消息
  346. goods.value = []
  347. }
  348. } catch (error) {
  349. console.log('请求失败', error)
  350. // 在这里可以处理错误逻辑,比如显示错误提示等
  351. }
  352. }
  353. // 处理排序事件
  354. const handleSortChange = (column) => {
  355. console.log('排序字段:', column.prop)
  356. console.log('排序方式:', column.order)
  357. if (column.prop === 'permanentGold') {
  358. sortField.value = 'permanentGold'
  359. } else if (column.prop === 'taskGold') {
  360. sortField.value = 'taskGold'
  361. } else if (column.prop === 'freeGold') {
  362. sortField.value = 'freeGold'
  363. } else if (column.prop === 'createTime') {
  364. sortField.value = 'createTime'
  365. }
  366. sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
  367. ConsumeSelectBy()
  368. }
  369. const handlePageSizeChange = function (val) {
  370. getObj.value.pageSize = val
  371. ConsumeSelectBy()
  372. }
  373. const handleCurrentChange = function (val) {
  374. getObj.value.pageNum = val
  375. ConsumeSelectBy()
  376. }
  377. // 计算总金币数
  378. const sumGold = computed(() => permanentGolds.value + freeGolds.value + taskGolds.value)
  379. onMounted(async function () {
  380. await getAdminData()
  381. await ConsumeSelectBy()
  382. // getActivity();
  383. await getMarket()
  384. await getGoods()
  385. // await getPlatformData()
  386. })
  387. const exportExcel = async function () {
  388. const params = {
  389. consumeUser: {
  390. jwcode: consumeUser.value.jwcode || '',
  391. payPlatform: consumeUser.value.payPlatform || '',
  392. market: consumeUser.value.market || "",
  393. startTime: consumeUser.value.startTime || '',
  394. endTime: consumeUser.value.endTime || '',
  395. goodsName: consumeUser.value.goodsName || '',
  396. sortField: sortField.value || '',
  397. sortOrder: sortOrder.value || '',
  398. flag: flag.value // 新增 flag 参数
  399. }
  400. }
  401. const res = await API({ url: '/export/exportConsume', data: params })
  402. if (res.code === 200) {
  403. ElMessage.success(t('elmessage.exportSuccess'))
  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 === 4; //4表示金币消耗列表
  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. // 存储地区选择变化
  478. const selectedMarketPath = ref("")
  479. const handleMarketChange = (value) => {
  480. if (value && value.length > 0) {
  481. const lastValue = value[value.length - 1]
  482. consumeUser.value.market = reverseMarketMapping[lastValue]
  483. } else {
  484. consumeUser.value.market = ''
  485. }
  486. }
  487. // 获取地区,修改为级联下拉框
  488. const getMarket = async function () {
  489. try {
  490. // 发送POST请求
  491. const result = await API({
  492. url: '/market/selectMarket',
  493. });
  494. // 将响应结果存储到响应式数据中
  495. console.log('请求成功', result)
  496. // 递归转换树形结构为级联选择器需要的格式(跳过第一级节点)
  497. const transformTree = (nodes) => {
  498. // 直接处理第一级节点的子节点
  499. const allChildren = nodes.flatMap(node => node.children || []);
  500. return allChildren.map(child => {
  501. const grandchildren = child.children && child.children.length
  502. ? transformTree([child]) // 递归处理子节点
  503. : null;
  504. return {
  505. value: child.name,
  506. label: child.name,
  507. children: grandchildren
  508. };
  509. });
  510. };
  511. // 存储地区信息
  512. market.value = transformTree(result.data)
  513. console.log('转换后的地区树==============', market.value)
  514. } catch (error) {
  515. console.log('请求失败', error)
  516. }
  517. }
  518. </script>
  519. <template>
  520. <el-card class="card1" style="margin-bottom: 0.5vh;">
  521. <el-col style="margin-bottom: 1vh">
  522. <div class="select">
  523. <div class="selectRow">
  524. <el-text class="text" size="large">{{ $t('common.jwcode') }}</el-text>
  525. <el-input class="selectContent" v-model="consumeUser.jwcode" :placeholder="$t('common.jwcodePlaceholder')" clearable />
  526. </div>
  527. <div class="selectRow">
  528. <el-text class="text" size="large">{{ $t('common.goodsName') }}</el-text>
  529. <el-select class="selectContent" v-model="consumeUser.goodsName" :placeholder="$t('common.goodsNamePlaceholder')" clearable filterable>
  530. <el-option v-for="(item, index) in goods" :key="index" :label="item.label" :value="item" />
  531. </el-select>
  532. </div>
  533. <div class="selectRow" style="width: 15vw;">
  534. <el-text size="large">{{ $t('common.market') }}</el-text>
  535. <el-cascader class="selectContent" style="width: 8vw;" v-model="selectedMarketPath" :options="market" :placeholder="$t('common.marketPlaceholder')"
  536. clearable @change="handleMarketChange" />
  537. </div>
  538. <div class="selectRow" style="min-width: 15vw;">
  539. <el-text size="large">{{ $t('common.consumePlatform') }}</el-text>
  540. <el-select class="selectContent" v-model="consumeUser.payPlatform" :placeholder="$t('common.consumePlatformPlaceholder')" clearable>
  541. <el-option v-for="item in consumePlatform" :key="item.id" :label="item.label" :value="item.value" />
  542. </el-select>
  543. </div>
  544. <!-- <el-checkbox v-model="showEmployeeData" @change="search()">员工数据</el-checkbox> -->
  545. </div>
  546. </el-col>
  547. <el-col>
  548. <div class="select">
  549. <div class="selectRow">
  550. <el-text size="large" class="text">订单状态</el-text>
  551. <el-select class="selectContent" v-model="consumeUser.status" placeholder="请选择订单状态" clearable>
  552. <el-option v-for="item in consumeStatus" :key="item.id" :label="item.label" :value="item.value" />
  553. </el-select>
  554. </div>
  555. <div class="selectRow" style="width: 36vw;">
  556. <el-text class="text" size="large">{{ $t('common.consumeTime') }}</el-text>
  557. <el-date-picker class="selectContent" v-model="getTime" type="datetimerange" :range-separator="$t('common.to')"
  558. :start-placeholder="$t('common.startTime')" :end-placeholder="$t('common.endTime')" style="margin-right:1vw;width:25vw"
  559. @change="handleDatePickerChange" :default-time="defaultTime" :disabled-date="disabledDate" />
  560. <div v-if="false">
  561. <el-button @click="getToday()" style="margin-left: 1vw"
  562. :type="activeTimeRange === 'today' ? 'primary' : ''">
  563. </el-button>
  564. <el-button @click="getYesterday()" style="margin-left: 1vw"
  565. :type="activeTimeRange === 'yesterday' ? 'primary' : ''">
  566. </el-button>
  567. <el-button @click="get7Days()" style="margin-left: 1vw"
  568. :type="activeTimeRange === '7days' ? 'primary' : ''">
  569. 近7天
  570. </el-button>
  571. </div>
  572. </div>
  573. <div class="selectRow" style="justify-content: flex-start;">
  574. <el-button type="primary" @click="search()">{{ $t('common.search') }}</el-button>
  575. <el-button type="primary" @click="exportExcel()">{{ $t('common.exportExcel') }}</el-button>
  576. <el-button type="primary" @click="openExportList">{{ $t('common.viewExportList') }}</el-button>
  577. <el-button type="success" @click="reset()">{{ $t('common.reset') }}</el-button>
  578. </div>
  579. </div>
  580. </el-col>
  581. </el-card>
  582. <el-card class="card2">
  583. <div class="goldStatistics">
  584. {{ $t('common.consumeSGD') }}{{ format3(Math.abs(permanentGolds)) }} {{ $t('common.SGD') }}&nbsp;&nbsp;&nbsp;&nbsp;
  585. {{ $t('common.totalGoldCoin') }}{{ format3(Math.abs(permanentGolds + freeGolds + taskGolds)) }}&nbsp;&nbsp;&nbsp;&nbsp;
  586. {{ $t('common.permanentGold') }}{{ format3(Math.abs(permanentGolds)) }}&nbsp;&nbsp;&nbsp;&nbsp;
  587. {{ $t('common.freeGold') }}{{ format3(Math.abs(freeGolds)) }}&nbsp;&nbsp;&nbsp;&nbsp;
  588. {{ $t('common.taskGold') }}{{ format3(Math.abs(taskGolds)) }}
  589. </div>
  590. <div style="height: 65vh;">
  591. <el-table :data="tableData" style="height: 65vh" @sort-change="handleSortChange"
  592. :row-style="{ height: '50px' }">
  593. <el-table-column type="index" :label="$t('common_list.id')" width="80px" fixed="left">
  594. <template #default="scope">
  595. <span>{{
  596. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  597. }}</span>
  598. </template>
  599. </el-table-column>
  600. <el-table-column prop="name" :label="$t('common_list.name')" width="150px" fixed="left" show-overflow-tooltip />
  601. <el-table-column prop="jwcode" :label="$t('common_list.jwcode')" width="110px" fixed="left" />
  602. <el-table-column prop="market" :label="$t('common_list.market')" width="110px" />
  603. <el-table-column prop="orderCode" :label="$t('common_list.orderNo')" width="260px" show-overflow-tooltip />
  604. _list
  605. <el-table-column prop="goodsName" :label="$t('common_list.goodsName')" width="160px" show-overflow-tooltip />
  606. <el-table-column prop="payPlatform" :label="$t('common_list.consumePlatform')" width="130px">
  607. <template #default="scope">
  608. {{ scope.row.payPlatform }}
  609. </template>
  610. </el-table-column>
  611. <el-table-column prop="sumGold" :label="$t('common_list.consumeTotalGold')" width="140px">
  612. <template #default="scope">
  613. {{
  614. (scope.row.taskGold +
  615. scope.row.freeGold +
  616. scope.row.permanentGold)
  617. }}
  618. </template>
  619. </el-table-column>
  620. <el-table-column prop="permanentGold" :label="$t('common_list.permanentGold')" sortable="“custom”" width="130px">
  621. <template #default="scope">
  622. {{ scope.row.permanentGold }}
  623. </template>
  624. </el-table-column>
  625. <el-table-column prop="freeGold" :label="$t('common_list.freeGold')" sortable="“custom”" width="130px">
  626. <template #default="scope">
  627. {{ scope.row.freeGold }}
  628. </template>
  629. </el-table-column>
  630. <el-table-column prop="taskGold" :label="$t('common_list.taskGold')" sortable="“custom”" width="130px">
  631. <template #default="scope">
  632. {{ scope.row.taskGold }}
  633. </template>
  634. </el-table-column>
  635. <el-table-column prop="remark" :label="$t('common_list.remark')" width="200px" show-overflow-tooltip />
  636. <el-table-column prop="isRefund" :label="$t('common_list.orderStatus')" width="200px" show-overflow-tooltip>
  637. <template #default="scope">
  638. <span v-if="scope.row.isRefund == 0">{{ $t('consume.normal') }}</span>
  639. <span v-else-if="scope.row.isRefund == 1">{{ $t('consume.refunded') }}</span>
  640. <span v-else>{{ $t('consume.unknown') }}</span>
  641. </template>
  642. </el-table-column>
  643. <el-table-column prop="adminName" :label="$t('common_list.submitter')" width="110px" />
  644. <el-table-column prop="createTime" :label="$t('common_list.consumeTime')" sortable="custom" width="180px" />
  645. </el-table>
  646. </div>
  647. <!-- 分页 -->
  648. <div class="pagination">
  649. <el-pagination background :current-page="getObj.pageNum" :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  650. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
  651. @current-change="handleCurrentChange"></el-pagination>
  652. </div>
  653. </el-card>
  654. <!-- 导出弹窗 -->
  655. <el-dialog v-model="exportListVisible" :title="$t('common_export.exportList')" width="80%">
  656. <el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
  657. <el-table-column prop="fileName" :label="$t('common_export.fileName')" />
  658. <el-table-column prop="state" :label="$t('common_export.status')">
  659. <template #default="scope">
  660. <el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'">
  661. {{ getTagText(scope.row.state) }}
  662. </el-tag>
  663. </template>
  664. </el-table-column>
  665. <el-table-column prop="createTime" :label="$t('common_export.createTime')">
  666. <template #default="scope">
  667. {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
  668. </template>
  669. </el-table-column>
  670. <el-table-column :label="$t('common_export.operation')">
  671. <template #default="scope">
  672. <el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
  673. :disabled="scope.row.state !== 2">
  674. {{ $t('common_export.download') }}
  675. </el-button>
  676. </template>
  677. </el-table-column>
  678. </el-table>
  679. <template #footer>
  680. <div class="dialog-footer">
  681. <el-button text @click="exportListVisible = false">{{ $t('common_export.close') }}</el-button>
  682. </div>
  683. </template>
  684. </el-dialog>
  685. </template>
  686. <style scoped lang="scss">
  687. .status {
  688. display: flex;
  689. }
  690. .head-card {
  691. display: flex;
  692. }
  693. .head-card-element {
  694. margin-right: 20px;
  695. }
  696. .head-card-btn {
  697. margin-left: auto;
  698. }
  699. .pagination {
  700. display: flex;
  701. margin-top: 1vh;
  702. }
  703. // 搜索的卡片样式
  704. .card1 {
  705. background: #F3FAFE;
  706. }
  707. // 表单的卡片样式
  708. .card2 {
  709. background: #E7F4FD;
  710. }
  711. // 新币总数等等
  712. .goldStatistics {
  713. margin-left: 1vw;
  714. margin-bottom: 1vh;
  715. color: #000000;
  716. font-family: "PingFang SC";
  717. font-size: 16px;
  718. font-style: normal;
  719. font-weight: 700;
  720. line-height: 20px;
  721. }
  722. // 表头背景等
  723. :deep(.el-table__header-wrapper),
  724. :deep(.el-table__body-wrapper),
  725. :deep(.el-table__cell),
  726. /* 表格 */
  727. :deep(.el-table__body td) {
  728. background-color: #F3FAFE !important;
  729. }
  730. /* 表头 */
  731. :deep(.el-table__header th) {
  732. background-color: #F3FAFE !important;
  733. }
  734. /* 鼠标悬停 */
  735. :deep(.el-table__row:hover > .el-table__cell) {
  736. background-color: #E5EBFE !important;
  737. }
  738. /** 搜索的样式 */
  739. .select {
  740. display: flex;
  741. .selectRow {
  742. width: 17vw;
  743. display: flex;
  744. align-items: center;
  745. justify-content: center;
  746. padding: 0 0.5vw;
  747. .text {
  748. width: 5.5vw;
  749. font-size: 15px;
  750. }
  751. .selectContent {
  752. flex: 1;
  753. }
  754. }
  755. }
  756. </style>