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.

661 lines
22 KiB

3 weeks ago
3 weeks ago
3 weeks ago
2 months ago
3 months ago
2 months ago
4 months ago
4 months ago
3 weeks ago
3 months ago
4 months ago
3 months ago
3 weeks ago
3 weeks ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 weeks ago
3 months ago
3 months ago
4 months ago
3 weeks ago
3 months ago
3 months ago
4 months ago
3 months ago
3 months ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
4 months ago
3 weeks ago
4 months ago
3 months ago
4 months ago
4 months ago
4 months ago
4 months ago
3 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
3 weeks ago
4 months ago
3 weeks ago
4 months ago
2 weeks ago
4 months ago
4 months ago
  1. <template>
  2. <el-card 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">精网号</el-text>
  7. <el-input class="selectContent" v-model="searchForm.jwcode" placeholder="请输入精网号" clearable />
  8. </div>
  9. <div class="selectRow">
  10. <el-text class="text" size="large">商品名称</el-text>
  11. <el-select class="selectContent" v-model="searchForm.goodsName" placeholder="请输入商品名称" clearable>
  12. <el-option v-for="item in refundGoodsOptions" :key="item" :label="item" :value="item"></el-option>
  13. </el-select>
  14. </div>
  15. <div class="selectRow">
  16. <el-text class="text" size="large">退款类型</el-text>
  17. <el-select class="selectContent" v-model="searchForm.refundType" placeholder="请选择退款类型" clearable>
  18. <el-option label="商品退款" value="商品退款" />
  19. <el-option label="金币退款" value="金币退款" />
  20. </el-select>
  21. </div>
  22. <div class="selectRow">
  23. <el-text class="text" size="large">所属地区</el-text>
  24. <el-cascader class="selectContent" style="width: 12vw;" v-model="selectedMarketPath" :options="market"
  25. placeholder="请选择所属地区" clearable @change="handleMarketChange" />
  26. </div>
  27. </div>
  28. </el-col>
  29. <el-col>
  30. <div class="select">
  31. <div class="selectRow" style="width: 36vw;">
  32. <el-text class="text" size="large">
  33. {{ activeName === 'wait' ? '提交时间:' : '审核时间:' }}
  34. </el-text>
  35. <el-date-picker class="selectContent" v-model="dateRange" type="datetimerange" range-separator=""
  36. start-placeholder="起始时间" end-placeholder="结束时间" style="margin-right:1vw;width:25vw"
  37. @change="handleDatePickerChange" :default-time="defaultTime" :disabled-date="disabledDate" />
  38. <div v-if="false">
  39. <el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button>
  40. <el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"></el-button>
  41. <el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button>
  42. </div>
  43. </div>
  44. <div class="selectRow" style="justify-content: flex-start;">
  45. <el-button @click="resetSearch" type="success">重置</el-button>
  46. <el-button @click="handleSearch" type="primary">查询</el-button>
  47. </div>
  48. </div>
  49. </el-col>
  50. </el-card>
  51. <el-card >
  52. <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
  53. <el-tab-pane label="待审核" name="wait" v-if="hasrefundWait&&hasrefundWaitShow"></el-tab-pane>
  54. <el-tab-pane label="已通过" name="pass" v-if="hasrefundThrough"></el-tab-pane>
  55. <el-tab-pane label="已驳回" name="reject" v-if="hasrefundReject"></el-tab-pane>
  56. </el-tabs>
  57. <div>
  58. 退款总金币数{{ format3((stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2))
  59. }}金币&nbsp;&nbsp;&nbsp;&nbsp;
  60. 永久金币{{ format3(stats.permanentGolds.toFixed(2)) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
  61. 免费金币{{ format3(stats.freeGolds.toFixed(2)) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
  62. 任务金币{{ format3(stats.taskGolds.toFixed(2)) }}金币
  63. </div>
  64. <el-table :data="tableData" style="height:54vh;width:82vw" @sort-change="handleSortChange">
  65. <el-table-column type="index" label="序号" width="60" />
  66. <el-table-column prop="name" label="姓名" width="120" show-overflow-tooltip />
  67. <el-table-column prop="jwcode" label="精网号" width="120" />
  68. <el-table-column prop="market" label="所属地区" width="120" />
  69. <el-table-column prop="orderCode" label="订单号" width="260px" show-overflow-tooltip />
  70. <el-table-column prop="refundType" label="退款类型" width="120" />
  71. <el-table-column prop="refundModel" label="退款方式" width="120">
  72. <template #default="{ row }">
  73. {{ row.refundModel === 0 ? '全部退款' : '部分退款' }}
  74. </template>
  75. </el-table-column>
  76. <el-table-column prop="goodsName" label="退款商品" width="120" show-overflow-tooltip />
  77. <el-table-column prop="sumGold" label="退款金币总数" width="160" sortable="custom">
  78. <template #default="{ row }">
  79. {{ row.sumGold / 100 }}
  80. </template>
  81. </el-table-column>
  82. <el-table-column prop="permanentGold" label="永久金币" width="120" sortable="custom">
  83. <template #default="{ row }">
  84. {{ row.permanentGold / 100 }}
  85. </template>
  86. </el-table-column>
  87. <el-table-column prop="freeGold" label="免费金币" width="120" sortable="custom">
  88. <template #default="{ row }">
  89. {{ (row.freeJune + row.freeDecember) / 100 }}
  90. </template>
  91. </el-table-column>
  92. <el-table-column prop="taskGold" label="任务金币" width="120" sortable="custom">
  93. <template #default="{ row }">
  94. {{ row.taskGold / 100 }}
  95. </template>
  96. </el-table-column>
  97. <el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip />
  98. <el-table-column prop="adminName" label="提交人" width="120" />
  99. <el-table-column v-if="checkTab === 'reject'" prop="rejectReason" label="驳回理由" width="150"
  100. show-overflow-tooltip />
  101. <el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120" />
  102. <el-table-column prop="createTime" label="提交时间" width="180" sortable="custom">
  103. <template #default="{ row }">
  104. {{
  105. checkTab === 'pending'
  106. ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss')
  107. : moment(row.createTime).format('YYYY-MM-DD HH:mm:ss')
  108. }}
  109. </template>
  110. </el-table-column>
  111. <el-table-column v-if="checkTab !== 'pending'" prop="auditTime" label="审核时间" width="180">
  112. <template #default="{ row }">
  113. {{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }}
  114. </template>
  115. </el-table-column>
  116. <el-table-column v-if="checkTab === 'pending' && (hasrefundWaitThough || hasrefundWaitReject)&&hasrefundWaitShow" fixed="right"
  117. prop="operation" label="操作" width="150px">
  118. <template #default="scope">
  119. <div class="operation">
  120. <el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
  121. <template #reference>
  122. <el-button v-if="hasrefundWaitThough" :disabled="clicked || cancelClicked" type="primary" text>
  123. 通过
  124. </el-button>
  125. </template>
  126. <template #actions="{ confirm, cancel }">
  127. <el-button size="small" @click="cancel">取消</el-button>
  128. <el-button type="primary" size="small" :disabled="clicked" @click="confirm">
  129. 确认
  130. </el-button>
  131. </template>
  132. </el-popconfirm>
  133. <el-button v-if="hasrefundWaitReject" :disabled="clicked || cancelClicked" type="primary" text
  134. @click="showRejectDialog(scope.row)">
  135. 驳回
  136. </el-button>
  137. </div>
  138. </template>
  139. </el-table-column>
  140. </el-table>
  141. <el-pagination class="pagination" v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize"
  142. layout="total, sizes, prev, pager, next, jumper" :total="pagination.total" @size-change="handlePageSizeChange"
  143. @current-change="handleCurrentChange"></el-pagination>
  144. </el-card>
  145. <el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
  146. <el-form>
  147. <el-form-item label="驳回理由" required>
  148. <el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
  149. show-word-limit />
  150. </el-form-item>
  151. </el-form>
  152. <template #footer>
  153. <span class="dialog-footer">
  154. <el-button @click="rejectDialogVisible = false">取消</el-button>
  155. <el-button type="primary" @click="handleReject">确定</el-button>
  156. </span>
  157. </template>
  158. </el-dialog>
  159. </template>
  160. <script setup>
  161. import { onMounted, reactive, ref } from 'vue'
  162. import { ElMessage } from 'element-plus'
  163. import API from '@/util/http.js'
  164. import moment from 'moment'
  165. import { useAdminStore } from "@/store/index.js";
  166. import { storeToRefs } from "pinia";
  167. import dayjs from "dayjs";
  168. import { permissionMapping, hasMenuPermission } from "@/utils/menuTreePermission.js"
  169. const adminStore = useAdminStore();
  170. const { adminData, menuTree } = storeToRefs(adminStore);
  171. const defaultTime = [
  172. new Date(2000, 1, 1, 0, 0, 0),
  173. new Date(2000, 2, 1, 23, 59, 59),
  174. ]
  175. // 当前激活的时间按钮
  176. const activeTimeRange = ref('')
  177. const scopeValue = ref(null) // 当前行
  178. const rejectDialogVisible = ref(false)
  179. const rejectReason = ref('')
  180. // 状态常量
  181. const STATUS = {
  182. PENDING: 0, // 待审核
  183. APPROVED: 1, // 通过
  184. REJECTED: 2 // 驳回
  185. }
  186. //无法选择的时间
  187. const disabledDate = (time) => {
  188. const limitDate = new Date(2025, 0, 1);
  189. return time.getTime() < limitDate.getTime();
  190. }
  191. // 搜索表单数据
  192. const searchForm = ref({
  193. jwcode: '',
  194. refundModel: '',
  195. goodsName: '',
  196. market: "",
  197. startTime: '',
  198. endTime: '',
  199. auditStatus: '0'
  200. })
  201. const checkTab = ref('pending') // 能否不用STATUS常量,0是待审批,1是已通过,2是驳回,参数status需要Integer
  202. const dateRange = ref([])
  203. const pagination = ref({
  204. pageNum: 1,
  205. pageSize: 50,
  206. total: 0
  207. })
  208. const tableData = ref([])
  209. const marketOptions = ref([])
  210. const refundGoodsOptions = ref([])
  211. const adminInfo = ref({})
  212. // 统计合计数
  213. const stats = ref({
  214. totalNum: 0,
  215. totalCoins: 0,
  216. permanentGolds: 0,
  217. freeGolds: 0,
  218. taskGolds: 0
  219. })
  220. const rejectVisible = ref(false)
  221. const rejectObj = ref({})
  222. const passObj = ref({})
  223. // 标签页默认是待审批
  224. const activeName = ref('wait')
  225. const sortField = ref('')
  226. const sortOrder = ref('')
  227. const market = ref("")
  228. //退款操作权限
  229. const hasrefundThrough = ref(false) // 退款审核已通过
  230. const hasrefundReject = ref(false) // 退款审核已驳回
  231. const hasrefundWait = ref(false) // 退款审核待审核
  232. const hasrefundWaitShow = ref(false) // 退款审核待审核查看
  233. const hasrefundWaitThough = ref(false) // 退款审核通过
  234. const hasrefundWaitReject = ref(false) // 退款审核驳回
  235. // 初始化权限状态
  236. const initPermissions = async() => {
  237. if (!menuTree.value || !menuTree.value.length) return;
  238. // 退款相关权限
  239. hasrefundThrough.value = hasMenuPermission(menuTree.value, permissionMapping.refundThrough);
  240. hasrefundReject.value = hasMenuPermission(menuTree.value, permissionMapping.refundReject);
  241. hasrefundWait.value = hasMenuPermission(menuTree.value, permissionMapping.refundWait);
  242. hasrefundWaitShow.value = hasMenuPermission(menuTree.value, permissionMapping.refundWaitShow);
  243. hasrefundWaitThough.value = hasMenuPermission(menuTree.value, permissionMapping.refundWaitThough);
  244. hasrefundWaitReject.value = hasMenuPermission(menuTree.value, permissionMapping.refundWaitReject);
  245. console.log('退款权限赋值完成');
  246. };
  247. // 处理排序事件
  248. const handleSortChange = (column) => {
  249. if (column.prop === 'sumGold') {
  250. sortField.value = 'sum_gold'
  251. } else if (column.prop === 'permanentGold') {
  252. sortField.value = 'permanent_gold'
  253. } else if (column.prop === 'freeGold') {
  254. sortField.value = 'freeGold'
  255. } else if (column.prop === 'taskGold') {
  256. sortField.value = 'task_gold'
  257. } else if (column.prop === 'createTime') {
  258. sortField.value = 'create_time'
  259. } else if (column.prop === 'auditTime') {
  260. sortField.value = 'audit_time'
  261. } else {
  262. sortField.value = ''
  263. }
  264. sortOrder.value = column.order === 'ascending' ? 'asc' : 'desc'
  265. console.log('排序字段:', sortField.value)
  266. console.log('排序方式:', sortOrder.value)
  267. get()
  268. }
  269. // 显示驳回对话框
  270. const showRejectDialog = (row) => {
  271. if (!hasrefundWaitReject) {
  272. ElMessage.error('暂无权限')
  273. return
  274. }
  275. scopeValue.value = row
  276. rejectReason.value = ''
  277. rejectDialogVisible.value = true
  278. }
  279. // 查商品名
  280. const getRefundGoods = async () => {
  281. try {
  282. const res = await API({ url: '/general/goods' })
  283. refundGoodsOptions.value = res.data || []
  284. } catch (error) {
  285. console.error('获取商品列表失败', error)
  286. }
  287. }
  288. // 搜索方法
  289. const get = async function (val) {
  290. if (!hasrefundWaitShow) {
  291. ElMessage.error('暂无权限')
  292. return
  293. }
  294. try {
  295. if (typeof val === 'number') {
  296. pagination.value.pageNum = val
  297. }
  298. if (dateRange.value && dateRange.value.length === 2) {
  299. searchForm.value.startTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
  300. searchForm.value.endTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
  301. } else {
  302. searchForm.value.startTime = ''
  303. searchForm.value.endTime = ''
  304. }
  305. // if (searchForm.value.market === '总部' || searchForm.value.market === '研发部') {
  306. // searchForm.value.market = '';
  307. // }
  308. const params = {
  309. pageNum: pagination.value.pageNum,
  310. pageSize: pagination.value.pageSize,
  311. refundAudit: {
  312. ...searchForm.value,
  313. sortField: sortField.value,
  314. sortOrder: sortOrder.value
  315. }
  316. }
  317. console.log('看看传给后端的参数:', params)
  318. // 校验精网号(数字格式)
  319. if (searchForm.value.jwcode) {
  320. // 纯数字
  321. const numberRegex = /^\d{1,9}$/;
  322. // 检查是否不是数字
  323. if (!numberRegex.test(searchForm.value.jwcode)) {
  324. ElMessage.error('请检查精网号格式')
  325. // 上面提示过了
  326. return
  327. }
  328. }
  329. const res = await API({ url: '/audit/selectRefund', data: params })
  330. tableData.value = res.list || []
  331. pagination.value.total = res.total || 0
  332. console.log('查全部的total', pagination.value.total, res.total)
  333. } catch (error) {
  334. console.error('获取数据失败', error)
  335. }
  336. }
  337. const clicked = ref(false);
  338. // 通过
  339. const handleApprove = async (row) => {
  340. if (!hasrefundWaitThough) {
  341. ElMessage.error('暂无权限')
  342. return
  343. }
  344. clicked.value = true
  345. try {
  346. const params = {
  347. orderCode: row.orderCode,
  348. auditId: adminData.value.id,
  349. action: 1,// action的1是通过,2是驳回
  350. rejectReason: ''
  351. }
  352. await API({ url: '/audit/audit', data: params })
  353. ElMessage.success('审核通过成功')
  354. await get()
  355. clicked.value = false
  356. await getStats()
  357. } catch (error) {
  358. console.error('审核通过失败', error)
  359. ElMessage.error('操作失败')
  360. }
  361. }
  362. //控制驳回确认按钮禁用状态
  363. const cancelClicked = ref(false)
  364. // 处理驳回操作
  365. const handleReject = async () => {
  366. if (!hasrefundWaitReject) {
  367. ElMessage.error('暂无权限')
  368. return
  369. }
  370. cancelClicked.value = true
  371. if (!rejectReason.value.trim()) {
  372. ElMessage.warning('请输入驳回理由')
  373. return
  374. }
  375. try {
  376. const params = {
  377. orderCode: scopeValue.value.orderCode,
  378. auditId: adminData.value.id,
  379. action: 2,
  380. rejectReason: rejectReason.value
  381. }
  382. await API({ url: '/audit/audit', data: params })
  383. ElMessage.success('驳回成功')
  384. rejectDialogVisible.value = false
  385. await get()
  386. cancelClicked.value = false
  387. await getStats()
  388. console.log('看看驳回参数', params)
  389. } catch (error) {
  390. console.error('驳回失败', error)
  391. ElMessage.error('操作失败')
  392. }
  393. }
  394. const getStats = async () => {
  395. if (!hasrefundWaitShow) {
  396. return
  397. }
  398. try {
  399. const params = {
  400. pageNum: pagination.value.pageNum,
  401. pageSize: pagination.value.pageSize,
  402. refundAudit: {
  403. ...searchForm.value
  404. }
  405. }
  406. if (searchForm.value.jwcode) {
  407. // 纯数字
  408. const numberRegex = /^\d{1,9}$/;
  409. // 检查是否不是数字
  410. if (!numberRegex.test(searchForm.value.jwcode)) {
  411. // ElMessage.error('精网号必须为数字格式')
  412. // 上面提示过了
  413. return
  414. }
  415. }
  416. const res = await API({
  417. url: '/audit/sumRefundGold',
  418. data: params
  419. })
  420. stats.value.totalNum = res.totalNum
  421. stats.value.permanentGolds = res.permanentGolds / 100
  422. stats.value.freeGolds = res.freeGolds / 100
  423. stats.value.taskGolds = res.taskGolds / 100
  424. console.log('see see stats和搜索对象', stats.value, params)
  425. } catch (error) {
  426. console.log('请求失败', error)
  427. }
  428. }
  429. // 搜索
  430. const handleSearch = function () {
  431. trimJwCode()
  432. get()
  433. getStats()
  434. }
  435. // 重置
  436. const resetSearch = function () {
  437. const auditStatus = searchForm.value.auditStatus;
  438. searchForm.value = {
  439. jwcode: '',
  440. refundType: '',
  441. goodsName: '',
  442. market: "",
  443. startTime: '',
  444. endTime: '',
  445. sortField: '',
  446. sortOrder: '',
  447. auditStatus: auditStatus
  448. }
  449. dateRange.value = []
  450. activeTimeRange.value = '' // 清除激活状态
  451. selectedMarketPath.value = []
  452. get()
  453. getStats()
  454. }
  455. // 今天
  456. const getToday = function () {
  457. const today = dayjs()
  458. const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
  459. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  460. dateRange.value = [startTime, endTime]
  461. console.log('dateRange', dateRange.value)
  462. activeTimeRange.value = 'today'
  463. get()
  464. getStats()
  465. }
  466. // 昨天
  467. const getYesterday = function () {
  468. const today = dayjs()
  469. const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  470. const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
  471. dateRange.value = [startTime, endTime]
  472. console.log('dateRange', dateRange.value)
  473. activeTimeRange.value = 'yesterday'
  474. get()
  475. getStats()
  476. }
  477. // 近7天
  478. const get7Days = function () {
  479. const today = dayjs()
  480. const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
  481. const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
  482. dateRange.value = [startTime, endTime]
  483. console.log('dateRange', dateRange.value)
  484. activeTimeRange.value = '7days'
  485. get()
  486. getStats()
  487. }
  488. const handleClick = function (tab, event) {
  489. activeName.value = tab.props.name
  490. if (tab.props.name === 'wait') {
  491. console.log(hasrefundWait.value);
  492. if (!hasrefundWait) {
  493. ElMessage.error('暂无权限')
  494. return
  495. }
  496. adminWait()
  497. } else if (tab.props.name === 'pass') {
  498. if (!hasrefundThrough.value) {
  499. ElMessage.error('暂无权限')
  500. return
  501. }
  502. adminPass()
  503. } else if (tab.props.name === 'reject') {
  504. if (!hasrefundReject) {
  505. ElMessage.error('暂无权限')
  506. return
  507. }
  508. adminReject()
  509. }
  510. }
  511. // 待审核
  512. const adminWait = async function () {
  513. checkTab.value = 'pending'
  514. searchForm.value.auditStatus = STATUS.PENDING
  515. await get()
  516. await getStats()
  517. }
  518. // 已通过
  519. const adminPass = async function () {
  520. checkTab.value = 'pass'
  521. searchForm.value.auditStatus = STATUS.APPROVED
  522. await get()
  523. await getStats()
  524. }
  525. // 已驳回
  526. const adminReject = async function () {
  527. checkTab.value = 'reject'
  528. searchForm.value.auditStatus = STATUS.REJECTED
  529. await get()
  530. await getStats()
  531. }
  532. const selectedMarketPath = ref("")
  533. const handleMarketChange = (value) => {
  534. if (value && value.length > 0) {
  535. searchForm.value.market = value[value.length - 1]
  536. } else {
  537. searchForm.value.market = ''
  538. }
  539. }
  540. // 获取地区,修改为级联下拉框
  541. const getMarket = async function () {
  542. try {
  543. const result = await API({
  544. url: '/market/selectMarket',
  545. })
  546. console.log('请求成功', result)
  547. // 递归转换树形结构为级联选择器需要的格式(跳过第一级节点)
  548. const transformTree = (nodes) => {
  549. // 直接处理第一级节点的子节点
  550. const allChildren = nodes.flatMap(node => node.children || []);
  551. return allChildren.map(child => {
  552. const grandchildren = child.children && child.children.length
  553. ? transformTree([child]) // 递归处理子节点
  554. : null;
  555. return {
  556. value: child.name,
  557. label: child.name,
  558. children: grandchildren
  559. };
  560. });
  561. };
  562. market.value = transformTree(result.data)
  563. console.log('转换后的地区树==============', market.value)
  564. } catch (error) {
  565. console.log('请求失败', error)
  566. }
  567. }
  568. const trimJwCode = () => {
  569. if (searchForm.value.jwcode) {
  570. searchForm.value.jwcode = searchForm.value.jwcode.replace(/\s/g, '');
  571. }
  572. }
  573. // 日期选择器变化时清除按钮激活状态
  574. const handleDatePickerChange = () => {
  575. activeTimeRange.value = ''
  576. }
  577. const format3 = (num) => {
  578. // 每三位添加逗号
  579. return num.toLocaleString('en-US')
  580. }
  581. // 表单验证
  582. const rules = reactive({
  583. reason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
  584. })
  585. const handlePageSizeChange = function (val) {
  586. pagination.value.pageSize = val
  587. get()
  588. }
  589. const handleCurrentChange = function (val) {
  590. pagination.value.pageNum = val
  591. get()
  592. }
  593. onMounted(async () => {
  594. await initPermissions()
  595. if(hasrefundWaitShow.value){
  596. searchForm.value.auditStatus = '0'
  597. }else if(hasrefundThrough.value){
  598. searchForm.value.auditStatus = '1'
  599. }else if(hasrefundReject){
  600. searchForm.value.auditStatus = '2'
  601. }
  602. getRefundGoods()
  603. await getMarket()
  604. await get()
  605. await getStats()
  606. })
  607. </script>
  608. <style scoped lang="scss">
  609. .pagination {
  610. display: flex;
  611. margin-top: 0.5vh;
  612. }
  613. .operation {
  614. display: flex;
  615. }
  616. .select {
  617. display: flex;
  618. .selectRow {
  619. width: 17vw;
  620. display: flex;
  621. align-items: center;
  622. justify-content: center;
  623. padding: 0 0.5vw;
  624. .text {
  625. width: 5vw;
  626. font-size: 15px;
  627. }
  628. .selectContent {
  629. flex: 1;
  630. }
  631. }
  632. }
  633. </style>