index.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <template>
  2. <ele-page>
  3. <!-- Stats Header -->
  4. <div class="stats-container">
  5. <el-row :gutter="15">
  6. <el-col :span="4">
  7. <el-card shadow="never" class="stat-card bg-gray-50" :body-style="{ padding: '10px' }">
  8. <div class="stat-title">退款处理时长</div>
  9. <div class="stat-value">6.35h</div>
  10. </el-card>
  11. </el-col>
  12. <el-col :span="4">
  13. <el-card shadow="never" class="stat-card bg-gray-50" :body-style="{ padding: '10px' }">
  14. <div class="stat-title">待平台处理</div>
  15. <div class="stat-value">10</div>
  16. </el-card>
  17. </el-col>
  18. <el-col :span="4">
  19. <el-card shadow="never" class="stat-card bg-gray-50" :body-style="{ padding: '10px' }">
  20. <div class="stat-title">退款待处理</div>
  21. <div class="stat-value">10</div>
  22. </el-card>
  23. </el-col>
  24. <el-col :span="4">
  25. <el-card shadow="never" class="stat-card bg-gray-50" :body-style="{ padding: '10px' }">
  26. <div class="stat-title">待平台收货</div>
  27. <div class="stat-value">10</div>
  28. </el-card>
  29. </el-col>
  30. <el-col :span="4">
  31. <el-card shadow="never" class="stat-card bg-gray-50" :body-style="{ padding: '10px' }">
  32. <div class="stat-title">24小时内即将追期</div>
  33. <div class="stat-value">10</div>
  34. </el-card>
  35. </el-col>
  36. <el-col :span="4">
  37. <el-card shadow="never" class="stat-card bg-gray-50" :body-style="{ padding: '10px' }">
  38. <div class="stat-title">待买家处理</div>
  39. <div class="stat-value">10</div>
  40. </el-card>
  41. </el-col>
  42. </el-row>
  43. </div>
  44. <!-- Search -->
  45. <page-search @search="handleSearch" />
  46. <ele-card :body-style="{ padding: '10px' }" class="mt-4">
  47. <!-- Tabs -->
  48. <el-tabs v-model="activeTab" @tab-click="handleTabClick">
  49. <el-tab-pane label="全部售后状态" name="all" />
  50. <el-tab-pane label="进行中的订单" name="processing" />
  51. <el-tab-pane label="待商家处理" name="merchant_pending" />
  52. <el-tab-pane label="待商家收货" name="merchant_receiving" />
  53. <el-tab-pane label="待买家发货" name="buyer_shipping" />
  54. <el-tab-pane label="已拒绝退款" name="rejected" />
  55. <el-tab-pane label="退款成功" name="success" />
  56. <el-tab-pane label="退款取消" name="cancelled" />
  57. </el-tabs>
  58. <!-- Table Header -->
  59. <div class="mt-2">
  60. <refund-table-header
  61. v-model:checkAll="checkAll"
  62. :is-indeterminate="isIndeterminate"
  63. @change="handleCheckAllChange"
  64. />
  65. </div>
  66. <!-- List -->
  67. <div class="refund-list" v-loading="loading">
  68. <refund-item
  69. v-for="(item, index) in list"
  70. :key="index"
  71. :item="item"
  72. @push-sms="handlePushSms"
  73. @send-packet="handleSendPacket"
  74. />
  75. </div>
  76. <!-- Pagination -->
  77. <div class="pagination-wrapper mt-4 flex justify-end">
  78. <el-pagination
  79. v-model:current-page="pageParams.page"
  80. v-model:page-size="pageParams.limit"
  81. :total="total"
  82. layout="total, sizes, prev, pager, next, jumper"
  83. @size-change="handleSizeChange"
  84. @current-change="handlePageChange"
  85. />
  86. </div>
  87. </ele-card>
  88. <!-- Dialogs -->
  89. <push-sms-dialog ref="pushSmsDialogRef" @success="handleSearch" />
  90. </ele-page>
  91. </template>
  92. <script setup>
  93. import { ref, reactive } from 'vue';
  94. import { EleMessage } from 'ele-admin-plus/es';
  95. import PageSearch from './components/page-search.vue';
  96. import RefundTableHeader from './components/refund-table-header.vue';
  97. import RefundItem from './components/refund-item.vue';
  98. import PushSmsDialog from './components/push-sms-dialog.vue';
  99. const activeTab = ref('all');
  100. const loading = ref(false);
  101. const total = ref(10);
  102. const pageParams = reactive({
  103. page: 1,
  104. limit: 10
  105. });
  106. const checkAll = ref(false);
  107. const isIndeterminate = ref(false);
  108. const list = ref([
  109. {
  110. checked: false,
  111. orderId: '4066879393210936038',
  112. refundId: '4066879393210936038',
  113. applyTime: '2024-10-04 12:01:09',
  114. product: {
  115. image: 'https://img14.360buyimg.com/n0/jfs/t1/157997/3/36676/122176/65e975a0F98822998/5023348143493720.jpg',
  116. title: '毛泽东思想和中国特色社会主义理论体系概论(2023年版)',
  117. isbn: '9787040599012',
  118. condition: '中等',
  119. code: 'wk-725154',
  120. qty: 1,
  121. price: 2.9
  122. },
  123. refundAmount: 2.9,
  124. buyer: {
  125. avatar: 'https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png',
  126. name: '书嗨4654645'
  127. },
  128. refundReason: '不喜欢,效果不好',
  129. logistics: {
  130. merchantShipped: true,
  131. buyerReturned: true
  132. },
  133. status: '退款成功'
  134. },
  135. {
  136. checked: false,
  137. orderId: '4066879393210936038',
  138. refundId: '4066879393210936038',
  139. applyTime: '2024-10-04 12:01:09',
  140. product: {
  141. image: 'https://img14.360buyimg.com/n0/jfs/t1/157997/3/36676/122176/65e975a0F98822998/5023348143493720.jpg',
  142. title: '毛泽东思想和中国特色社会主义理论体系概论(2023年版)',
  143. isbn: '9787040599012',
  144. condition: '中等',
  145. code: 'wk-725154',
  146. qty: 1,
  147. price: 2.9
  148. },
  149. refundAmount: 2.9,
  150. buyer: {
  151. avatar: 'https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png',
  152. name: '书嗨4654645'
  153. },
  154. refundReason: '不喜欢,效果不好',
  155. logistics: {
  156. merchantShipped: true,
  157. buyerReturned: true
  158. },
  159. status: '同意退款'
  160. }
  161. ]);
  162. const pushSmsDialogRef = ref(null);
  163. const handleSearch = (where) => {
  164. loading.value = true;
  165. setTimeout(() => {
  166. loading.value = false;
  167. EleMessage.success('查询成功');
  168. }, 500);
  169. };
  170. const handleTabClick = (tab) => {
  171. handleSearch();
  172. };
  173. const handleSizeChange = (val) => {
  174. pageParams.limit = val;
  175. handleSearch();
  176. };
  177. const handlePageChange = (val) => {
  178. pageParams.page = val;
  179. handleSearch();
  180. };
  181. const handleCheckAllChange = (val) => {
  182. list.value.forEach(item => item.checked = val);
  183. isIndeterminate.value = false;
  184. };
  185. const handlePushSms = (item) => {
  186. pushSmsDialogRef.value?.handleOpen(item);
  187. };
  188. const handleSendPacket = (item) => {
  189. EleMessage.warning('发红包功能暂未实现');
  190. };
  191. </script>
  192. <style scoped lang="scss">
  193. .stat-card {
  194. text-align: center;
  195. border: none;
  196. .stat-title {
  197. font-size: 13px;
  198. color: #606266;
  199. font-weight: bold;
  200. }
  201. .stat-value {
  202. font-size: 24px;
  203. font-weight: bold;
  204. color: #303133;
  205. }
  206. }
  207. </style>