index.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <div class="layout-padding">
  3. <div class="layout-padding-auto layout-padding-view">
  4. <el-row class="ml10" v-show="showSearch">
  5. <el-form :inline="true" :model="queryForm" @keyup.enter="handleSearch" ref="queryRef">
  6. <el-form-item label="通道名称" prop="channelName">
  7. <el-input placeholder="请输入通道名称" style="max-width: 180px" v-model="queryForm.channelName" clearable />
  8. </el-form-item>
  9. <el-form-item label="支付方式" prop="paymentName">
  10. <el-input placeholder="请输入支付方式" style="max-width: 180px" v-model="queryForm.paymentName" clearable />
  11. </el-form-item>
  12. <el-form-item label="支付类别" prop="paymentType">
  13. <el-select v-model="queryForm.paymentType" placeholder="请选择支付类别" style="max-width: 180px" clearable>
  14. <el-option label="代付" value="PAY" />
  15. <el-option label="代收" value="HARVEST" />
  16. </el-select>
  17. </el-form-item>
  18. <el-form-item>
  19. <el-button @click="handleSearch" icon="search" type="primary">查询</el-button>
  20. <el-button @click="resetQuery" icon="Refresh">重置</el-button>
  21. </el-form-item>
  22. </el-form>
  23. </el-row>
  24. <el-row>
  25. <div class="mb8" style="width: 100%">
  26. <el-button @click="loadData" class="ml10" icon="Refresh" type="primary">刷新</el-button>
  27. <right-toolbar
  28. @queryTable="handleSearch"
  29. class="ml10"
  30. style="float: right; margin-right: 20px"
  31. v-model:showSearch="showSearch"
  32. ></right-toolbar>
  33. </div>
  34. </el-row>
  35. <el-table
  36. :data="filteredData"
  37. style="width: 100%"
  38. v-loading="loading"
  39. border
  40. :cell-style="tableStyle.cellStyle"
  41. :header-cell-style="tableStyle.headerCellStyle"
  42. >
  43. <el-table-column label="通道名称" prop="channelName" show-overflow-tooltip align="center">
  44. <template #default="scope">
  45. {{ scope.row.channelName || '--' }}
  46. </template>
  47. </el-table-column>
  48. <el-table-column label="支付方式" prop="paymentName" show-overflow-tooltip align="center">
  49. <template #default="scope">
  50. {{ scope.row.paymentName || '--' }}
  51. </template>
  52. </el-table-column>
  53. <el-table-column label="支付类别" prop="paymentType" show-overflow-tooltip align="center">
  54. <template #default="scope">
  55. <el-tag :type="scope.row.paymentType === 'PAY' ? 'warning' : 'info'">
  56. {{ paymentTypeMap[scope.row.paymentType] || scope.row.paymentType }}
  57. </el-tag>
  58. </template>
  59. </el-table-column>
  60. <el-table-column label="商户手续费类型" prop="mfeeType" show-overflow-tooltip align="center">
  61. <template #default="scope">
  62. {{ feeTypeMap[scope.row.mfeeType] || scope.row.mfeeType }}
  63. </template>
  64. </el-table-column>
  65. <el-table-column label="商户手续费比例" prop="mfeeRate" show-overflow-tooltip align="center">
  66. <template #default="scope">
  67. {{ scope.row.mfeeRate ? `${scope.row.mfeeRate}%` : '0%' }}
  68. </template>
  69. </el-table-column>
  70. <el-table-column label="商户手续费固定金额" prop="mfeeEvery" show-overflow-tooltip align="center">
  71. <template #default="scope">
  72. <span class="amount-value">¥{{ scope.row.mfeeEvery ? scope.row.mfeeEvery.toFixed(2) : '0.00' }}</span>
  73. </template>
  74. </el-table-column>
  75. <el-table-column label="代理商手续费类型" prop="afeeType" show-overflow-tooltip align="center">
  76. <template #default="scope">
  77. {{ feeTypeMap[scope.row.afeeType] || scope.row.afeeType }}
  78. </template>
  79. </el-table-column>
  80. <el-table-column label="代理商手续费比例" prop="afeeRate" show-overflow-tooltip align="center">
  81. <template #default="scope">
  82. {{ scope.row.afeeRate ? `${scope.row.afeeRate}%` : '0%' }}
  83. </template>
  84. </el-table-column>
  85. <el-table-column label="代理商手续费固定金额" prop="afeeEvery" show-overflow-tooltip align="center">
  86. <template #default="scope">
  87. <span class="amount-value">¥{{ scope.row.afeeEvery ? scope.row.afeeEvery.toFixed(2) : '0.00' }}</span>
  88. </template>
  89. </el-table-column>
  90. </el-table>
  91. </div>
  92. </div>
  93. </template>
  94. <script lang="ts" name="paymentChannel" setup>
  95. import { getMerchantRate } from '/@/api/payment/channel';
  96. import { useMessage } from '/@/hooks/message';
  97. // 支付类别映射
  98. const paymentTypeMap: Record<string, string> = {
  99. PAY: '代付',
  100. HARVEST: '代收',
  101. };
  102. // 手续费类型映射
  103. const feeTypeMap: Record<string, string> = {
  104. PERCENTAGE: '百分比',
  105. FIXED: '固定金额',
  106. MIXED: '混合',
  107. };
  108. // 定义变量
  109. const queryRef = ref();
  110. const showSearch = ref(true);
  111. const loading = ref(false);
  112. const tableData = ref<any[]>([]);
  113. const queryForm = ref({
  114. channelName: '',
  115. paymentName: '',
  116. paymentType: '',
  117. });
  118. // 表格样式
  119. const tableStyle = {
  120. cellStyle: {
  121. textAlign: 'center',
  122. },
  123. headerCellStyle: {
  124. textAlign: 'center',
  125. background: '#fafafa',
  126. },
  127. };
  128. // 前端筛选数据
  129. const filteredData = computed(() => {
  130. let data = tableData.value;
  131. // 通道名称筛选
  132. if (queryForm.value.channelName) {
  133. data = data.filter((item) => item.channelName?.toLowerCase().includes(queryForm.value.channelName.toLowerCase()));
  134. }
  135. // 支付方式筛选
  136. if (queryForm.value.paymentName) {
  137. data = data.filter((item) => item.paymentName?.toLowerCase().includes(queryForm.value.paymentName.toLowerCase()));
  138. }
  139. // 支付类别筛选
  140. if (queryForm.value.paymentType) {
  141. data = data.filter((item) => item.paymentType === queryForm.value.paymentType);
  142. }
  143. return data;
  144. });
  145. // 查询
  146. const handleSearch = () => {
  147. // 前端筛选,无需额外操作
  148. };
  149. // 重置查询
  150. const resetQuery = () => {
  151. queryRef.value?.resetFields();
  152. };
  153. // 加载数据
  154. const loadData = async () => {
  155. loading.value = true;
  156. try {
  157. const res = await getMerchantRate();
  158. tableData.value = res.data || [];
  159. } catch (err: any) {
  160. useMessage().error(err.msg || '获取费率信息失败');
  161. } finally {
  162. loading.value = false;
  163. }
  164. };
  165. // 初始化加载
  166. onMounted(() => {
  167. loadData();
  168. });
  169. </script>
  170. <style scoped lang="scss">
  171. .amount-value {
  172. font-size: 14px;
  173. font-weight: bold;
  174. color: #f56c6c;
  175. }
  176. </style>