Commit cbc7b9dfc0e9ab56b6815f412a2f49751265a9e7

Authored by xingyu4j
1 parent 24439b70

refactor: pay

yudao-ui-admin-vue3/src/api/pay/app/index.ts
1 1 import request from '@/config/axios'
2   -import type { AppVO } from './types'
  2 +
  3 +export interface AppVO {
  4 + id: number
  5 + name: string
  6 + status: number
  7 + remark: string
  8 + payNotifyUrl: string
  9 + refundNotifyUrl: string
  10 + merchantId: number
  11 + merchantName: string
  12 + createTime: Date
  13 +}
  14 +
  15 +export interface AppPageReqVO extends PageParam {
  16 + name?: string
  17 + status?: number
  18 + remark?: string
  19 + payNotifyUrl?: string
  20 + refundNotifyUrl?: string
  21 + merchantName?: string
  22 + createTime?: Date[]
  23 +}
  24 +
  25 +export interface AppExportReqVO {
  26 + name?: string
  27 + status?: number
  28 + remark?: string
  29 + payNotifyUrl?: string
  30 + refundNotifyUrl?: string
  31 + merchantName?: string
  32 + createTime?: Date[]
  33 +}
  34 +
  35 +export interface AppUpdateStatusReqVO {
  36 + id: number
  37 + status: number
  38 +}
3 39  
4 40 // 查询列表支付应用
5   -export const getAppPageApi = (params) => {
  41 +export const getAppPageApi = (params: AppPageReqVO) => {
6 42 return request.get({ url: '/pay/app/page', params })
7 43 }
8 44  
... ... @@ -22,11 +58,7 @@ export const updateAppApi = (data: AppVO) => {
22 58 }
23 59  
24 60 // 支付应用信息状态修改
25   -export const changeAppStatusApi = (id: number, status: number) => {
26   - const data = {
27   - id,
28   - status
29   - }
  61 +export const changeAppStatusApi = (data: AppUpdateStatusReqVO) => {
30 62 return request.put({ url: '/pay/app/update-status', data: data })
31 63 }
32 64  
... ... @@ -36,7 +68,7 @@ export const deleteAppApi = (id: number) => {
36 68 }
37 69  
38 70 // 导出支付应用
39   -export const exportAppApi = (params) => {
  71 +export const exportAppApi = (params: AppExportReqVO) => {
40 72 return request.download({ url: '/pay/app/export-excel', params })
41 73 }
42 74  
... ...
yudao-ui-admin-vue3/src/api/pay/app/types.ts deleted
1   -export type AppVO = {
2   - id: number
3   - name: string
4   - status: number
5   - remark: string
6   - payNotifyUrl: string
7   - refundNotifyUrl: string
8   - merchantName: string
9   - merchantId: number
10   - createTime: string
11   -}
yudao-ui-admin-vue3/src/api/pay/channel/index.ts
1 1 import request from '@/config/axios'
2   -import type { ChannelVO } from './types'
  2 +
  3 +export interface ChannelVO {
  4 + id: number
  5 + code: string
  6 + config: string
  7 + status: number
  8 + remark: string
  9 + feeRate: number
  10 + merchantId: number
  11 + appId: number
  12 + createTime: Date
  13 +}
  14 +
  15 +export interface ChannelPageReqVO extends PageParam {
  16 + code?: string
  17 + status?: number
  18 + remark?: string
  19 + feeRate?: number
  20 + merchantId?: number
  21 + appId?: number
  22 + config?: string
  23 + createTime?: Date[]
  24 +}
  25 +
  26 +export interface ChannelExportReqVO {
  27 + code?: string
  28 + status?: number
  29 + remark?: string
  30 + feeRate?: number
  31 + merchantId?: number
  32 + appId?: number
  33 + config?: string
  34 + createTime?: Date[]
  35 +}
3 36  
4 37 // 查询列表支付渠道
5   -export const getChannelPageApi = (params) => {
  38 +export const getChannelPageApi = (params: ChannelPageReqVO) => {
6 39 return request.get({ url: '/pay/channel/page', params })
7 40 }
8 41  
... ... @@ -32,6 +65,6 @@ export const deleteChannelApi = (id: number) => {
32 65 }
33 66  
34 67 // 导出支付渠道
35   -export const exportChannelApi = (params) => {
  68 +export const exportChannelApi = (params: ChannelExportReqVO) => {
36 69 return request.download({ url: '/pay/channel/export-excel', params })
37 70 }
... ...
yudao-ui-admin-vue3/src/api/pay/channel/types.ts deleted
1   -export type ChannelVO = {
2   - id: number
3   - code: string
4   - config: string
5   - status: number
6   - remark: string
7   - feeRate: number
8   - merchantId: number
9   - appId: number
10   - createTime: string
11   -}
yudao-ui-admin-vue3/src/api/pay/merchant/index.ts
1 1 import request from '@/config/axios'
2   -import type { MerchantVO } from './types'
  2 +
  3 +export interface MerchantVO {
  4 + id: number
  5 + no: string
  6 + name: string
  7 + shortName: string
  8 + status: number
  9 + remark: string
  10 + createTime: Date
  11 +}
  12 +
  13 +export interface MerchantPageReqVO extends PageParam {
  14 + no?: string
  15 + name?: string
  16 + shortName?: string
  17 + status?: number
  18 + remark?: string
  19 + createTime?: Date[]
  20 +}
  21 +
  22 +export interface MerchantExportReqVO {
  23 + no?: string
  24 + name?: string
  25 + shortName?: string
  26 + status?: number
  27 + remark?: string
  28 + createTime?: Date[]
  29 +}
3 30  
4 31 // 查询列表支付商户
5   -export const getMerchantPageApi = (params) => {
  32 +export const getMerchantPageApi = (params: MerchantPageReqVO) => {
6 33 return request.get({ url: '/pay/merchant/page', params })
7 34 }
8 35  
... ... @@ -37,7 +64,7 @@ export const deleteMerchantApi = (id: number) => {
37 64 }
38 65  
39 66 // 导出支付商户
40   -export const exportMerchantApi = (params) => {
  67 +export const exportMerchantApi = (params: MerchantExportReqVO) => {
41 68 return request.download({ url: '/pay/merchant/export-excel', params })
42 69 }
43 70 // 支付商户状态修改
... ...
yudao-ui-admin-vue3/src/api/pay/merchant/types.ts deleted
1   -export type MerchantVO = {
2   - id: number
3   - no: string
4   - name: string
5   - shortName: string
6   - status: number
7   - remark: string
8   - createTime: string
9   -}
yudao-ui-admin-vue3/src/api/pay/order/index.ts
1 1 import request from '@/config/axios'
2   -import type { OrderVO } from './types'
  2 +
  3 +export interface OrderVO {
  4 + id: number
  5 + merchantId: number
  6 + appId: number
  7 + channelId: number
  8 + channelCode: string
  9 + merchantOrderId: string
  10 + subject: string
  11 + body: string
  12 + notifyUrl: string
  13 + notifyStatus: number
  14 + amount: number
  15 + channelFeeRate: number
  16 + channelFeeAmount: number
  17 + status: number
  18 + userIp: string
  19 + expireTime: Date
  20 + successTime: Date
  21 + notifyTime: Date
  22 + successExtensionId: number
  23 + refundStatus: number
  24 + refundTimes: number
  25 + refundAmount: number
  26 + channelUserId: string
  27 + channelOrderNo: string
  28 + createTime: Date
  29 +}
  30 +
  31 +export interface OrderPageReqVO extends PageParam {
  32 + merchantId?: number
  33 + appId?: number
  34 + channelId?: number
  35 + channelCode?: string
  36 + merchantOrderId?: string
  37 + subject?: string
  38 + body?: string
  39 + notifyUrl?: string
  40 + notifyStatus?: number
  41 + amount?: number
  42 + channelFeeRate?: number
  43 + channelFeeAmount?: number
  44 + status?: number
  45 + expireTime?: Date[]
  46 + successTime?: Date[]
  47 + notifyTime?: Date[]
  48 + successExtensionId?: number
  49 + refundStatus?: number
  50 + refundTimes?: number
  51 + channelUserId?: string
  52 + channelOrderNo?: string
  53 + createTime?: Date[]
  54 +}
  55 +
  56 +export interface OrderExportReqVO {
  57 + merchantId?: number
  58 + appId?: number
  59 + channelId?: number
  60 + channelCode?: string
  61 + merchantOrderId?: string
  62 + subject?: string
  63 + body?: string
  64 + notifyUrl?: string
  65 + notifyStatus?: number
  66 + amount?: number
  67 + channelFeeRate?: number
  68 + channelFeeAmount?: number
  69 + status?: number
  70 + expireTime?: Date[]
  71 + successTime?: Date[]
  72 + notifyTime?: Date[]
  73 + successExtensionId?: number
  74 + refundStatus?: number
  75 + refundTimes?: number
  76 + channelUserId?: string
  77 + channelOrderNo?: string
  78 + createTime?: Date[]
  79 +}
3 80  
4 81 // 查询列表支付订单
5   -export const getOrderPageApi = async (params) => {
  82 +export const getOrderPageApi = async (params: OrderPageReqVO) => {
6 83 return await request.get({ url: '/pay/order/page', params })
7 84 }
8 85  
... ... @@ -27,6 +104,6 @@ export const deleteOrderApi = async (id: number) => {
27 104 }
28 105  
29 106 // 导出支付订单
30   -export const exportOrderApi = async (params) => {
  107 +export const exportOrderApi = async (params: OrderExportReqVO) => {
31 108 return await request.download({ url: '/pay/order/export-excel', params })
32 109 }
... ...
yudao-ui-admin-vue3/src/api/pay/order/types.ts deleted
1   -export type OrderVO = {
2   - id: number
3   - merchantId: number
4   - appId: number
5   - channelId: number
6   - channelCode: string
7   - merchantOrderId: string
8   - subject: string
9   - body: string
10   - notifyUrl: string
11   - notifyStatus: number
12   - amount: number
13   - channelFeeRate: number
14   - channelFeeAmount: number
15   - status: number
16   - userIp: string
17   - expireTime: string
18   - successTime: string
19   - notifyTime: string
20   - successExtensionId: number
21   - refundStatus: number
22   - refundTimes: number
23   - refundAmount: number
24   - channelUserId: string
25   - channelOrderNo: string
26   -}
yudao-ui-admin-vue3/src/api/pay/refund/index.ts
1 1 import request from '@/config/axios'
2   -import type { RefundVO } from './types'
  2 +
  3 +export interface RefundVO {
  4 + id: number
  5 + merchantId: number
  6 + appId: number
  7 + channelId: number
  8 + channelCode: string
  9 + orderId: string
  10 + tradeNo: string
  11 + merchantOrderId: string
  12 + merchantRefundNo: string
  13 + notifyUrl: string
  14 + notifyStatus: number
  15 + status: number
  16 + type: number
  17 + payAmount: number
  18 + refundAmount: number
  19 + reason: string
  20 + userIp: string
  21 + channelOrderNo: string
  22 + channelRefundNo: string
  23 + channelErrorCode: string
  24 + channelErrorMsg: string
  25 + channelExtras: string
  26 + expireTime: Date
  27 + successTime: Date
  28 + notifyTime: Date
  29 + createTime: Date
  30 +}
  31 +
  32 +export interface RefundPageReqVO extends PageParam {
  33 + merchantId?: number
  34 + appId?: number
  35 + channelId?: number
  36 + channelCode?: string
  37 + orderId?: string
  38 + tradeNo?: string
  39 + merchantOrderId?: string
  40 + merchantRefundNo?: string
  41 + notifyUrl?: string
  42 + notifyStatus?: number
  43 + status?: number
  44 + type?: number
  45 + payAmount?: number
  46 + refundAmount?: number
  47 + reason?: string
  48 + userIp?: string
  49 + channelOrderNo?: string
  50 + channelRefundNo?: string
  51 + channelErrorCode?: string
  52 + channelErrorMsg?: string
  53 + channelExtras?: string
  54 + expireTime?: Date[]
  55 + successTime?: Date[]
  56 + notifyTime?: Date[]
  57 + createTime?: Date[]
  58 +}
  59 +
  60 +export interface PayRefundExportReqVO {
  61 + merchantId?: number
  62 + appId?: number
  63 + channelId?: number
  64 + channelCode?: string
  65 + orderId?: string
  66 + tradeNo?: string
  67 + merchantOrderId?: string
  68 + merchantRefundNo?: string
  69 + notifyUrl?: string
  70 + notifyStatus?: number
  71 + status?: number
  72 + type?: number
  73 + payAmount?: number
  74 + refundAmount?: number
  75 + reason?: string
  76 + userIp?: string
  77 + channelOrderNo?: string
  78 + channelRefundNo?: string
  79 + channelErrorCode?: string
  80 + channelErrorMsg?: string
  81 + channelExtras?: string
  82 + expireTime?: Date[]
  83 + successTime?: Date[]
  84 + notifyTime?: Date[]
  85 + createTime?: Date[]
  86 +}
3 87  
4 88 // 查询列表退款订单
5   -export const getRefundPageApi = (params) => {
  89 +export const getRefundPageApi = (params: RefundPageReqVO) => {
6 90 return request.get({ url: '/pay/refund/page', params })
7 91 }
8 92  
... ... @@ -27,6 +111,6 @@ export const deleteRefundApi = (id: number) => {
27 111 }
28 112  
29 113 // 导出退款订单
30   -export const exportRefundApi = (params) => {
  114 +export const exportRefundApi = (params: PayRefundExportReqVO) => {
31 115 return request.download({ url: '/pay/refund/export-excel', params })
32 116 }
... ...
yudao-ui-admin-vue3/src/api/pay/refund/types.ts deleted
1   -export type RefundVO = {
2   - id: number
3   - merchantId: number
4   - appId: number
5   - channelId: number
6   - channelCode: string
7   - merchantOrderId: string
8   - subject: string
9   - body: string
10   - notifyUrl: string
11   - notifyStatus: number
12   - amount: number
13   - channelFeeRate: number
14   - channelFeeAmount: number
15   - status: number
16   - userIp: string
17   - expireTime: string
18   - successTime: string
19   - notifyTime: string
20   - successExtensionId: number
21   - refundStatus: number
22   - refundTimes: number
23   - refundAmount: number
24   - channelUserId: string
25   - channelOrderNo: string
26   -}
yudao-ui-admin-vue3/src/hooks/web/useVxeCrudSchemas.ts
... ... @@ -121,18 +121,8 @@ const filterSearchSchema = (crudSchema: VxeCrudSchema): VxeFormItemProps[] => {
121 121 if (schemaItem?.isSearch || schemaItem.search?.show) {
122 122 let itemRenderName = schemaItem?.search?.itemRender?.name || '$input'
123 123 const options: any[] = []
124   - let itemRender: FormItemRenderOptions
125   - if (schemaItem.search?.itemRender) {
126   - itemRender = schemaItem.search.itemRender
127   - } else {
128   - itemRender = {
129   - name: itemRenderName,
130   - props:
131   - itemRenderName == '$input'
132   - ? { placeholder: t('common.inputText') }
133   - : { placeholder: t('common.selectText') }
134   - }
135   - }
  124 + let itemRender: FormItemRenderOptions = {}
  125 +
136 126 if (schemaItem.dictType) {
137 127 const allOptions = { label: '全部', value: '' }
138 128 options.push(allOptions)
... ... @@ -146,8 +136,19 @@ const filterSearchSchema = (crudSchema: VxeCrudSchema): VxeFormItemProps[] => {
146 136 options: options,
147 137 props: { placeholder: t('common.selectText') }
148 138 }
  139 + } else {
  140 + if (schemaItem.search?.itemRender) {
  141 + itemRender = schemaItem.search.itemRender
  142 + } else {
  143 + itemRender = {
  144 + name: itemRenderName,
  145 + props:
  146 + itemRenderName == '$input'
  147 + ? { placeholder: t('common.inputText') }
  148 + : { placeholder: t('common.selectText') }
  149 + }
  150 + }
149 151 }
150   -
151 152 const searchSchemaItem = {
152 153 // 默认为 input
153 154 folding: searchSchema.length > spanLength - 1,
... ... @@ -156,7 +157,6 @@ const filterSearchSchema = (crudSchema: VxeCrudSchema): VxeFormItemProps[] => {
156 157 title: schemaItem.search?.title || schemaItem.title,
157 158 span: span
158 159 }
159   -
160 160 searchSchema.push(searchSchemaItem)
161 161 }
162 162 })
... ...
yudao-ui-admin-vue3/src/views/pay/app/app.data.ts
1 1 import { reactive } from 'vue'
2 2 import { useI18n } from '@/hooks/web/useI18n'
3 3 import { required } from '@/utils/formRules'
4   -import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas'
5 4 import { DICT_TYPE } from '@/utils/dict'
  5 +import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
6 6 const { t } = useI18n() // 国际化
7 7  
8 8 // 表单校验
... ... @@ -15,67 +15,61 @@ export const rules = reactive({
15 15 })
16 16  
17 17 // CrudSchema
18   -const crudSchemas = reactive<CrudSchema[]>([
19   - {
20   - label: t('common.index'),
21   - field: 'id',
22   - type: 'index',
23   - form: {
24   - show: false
  18 +const crudSchemas = reactive<VxeCrudSchema>({
  19 + primaryKey: 'id',
  20 + primaryType: 'seq',
  21 + primaryTitle: '编号',
  22 + action: true,
  23 + columns: [
  24 + {
  25 + title: '应用名',
  26 + field: 'name',
  27 + isSearch: true
25 28 },
26   - detail: {
27   - show: false
28   - }
29   - },
30   - {
31   - label: '应用名',
32   - field: 'name',
33   - search: {
34   - show: true
35   - }
36   - },
37   - {
38   - label: '商户名称',
39   - field: 'payMerchant',
40   - search: {
41   - show: true
42   - }
43   - },
44   - {
45   - label: t('common.status'),
46   - field: 'status',
47   - dictType: DICT_TYPE.COMMON_STATUS,
48   - dictClass: 'number',
49   - search: {
50   - show: true
51   - }
52   - },
53   - {
54   - label: t('common.createTime'),
55   - field: 'createTime',
56   - form: {
57   - show: false
  29 + {
  30 + title: '商户名称',
  31 + field: 'payMerchant',
  32 + isSearch: true
58 33 },
59   - search: {
60   - show: true,
61   - component: 'DatePicker',
62   - componentProps: {
63   - type: 'datetimerange',
64   - valueFormat: 'YYYY-MM-DD HH:mm:ss',
65   - defaultTime: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)]
66   - }
67   - }
68   - },
69   - {
70   - label: t('table.action'),
71   - field: 'action',
72   - width: '240px',
73   - form: {
74   - show: false
  34 + {
  35 + title: t('common.status'),
  36 + field: 'status',
  37 + dictType: DICT_TYPE.COMMON_STATUS,
  38 + dictClass: 'number',
  39 + isSearch: true
75 40 },
76   - detail: {
77   - show: false
  41 + {
  42 + title: '支付结果的回调地址',
  43 + field: 'payNotifyUrl',
  44 + isSearch: true
  45 + },
  46 + {
  47 + title: '退款结果的回调地址',
  48 + field: 'refundNotifyUrl',
  49 + isSearch: true
  50 + },
  51 + {
  52 + title: '商户名称',
  53 + field: 'merchantName',
  54 + isSearch: true
  55 + },
  56 + {
  57 + title: '备注',
  58 + field: 'remark',
  59 + isTable: false,
  60 + isSearch: true
  61 + },
  62 + {
  63 + title: t('common.createTime'),
  64 + field: 'createTime',
  65 + isForm: false,
  66 + search: {
  67 + show: true,
  68 + itemRender: {
  69 + name: 'XDataTimePicker'
  70 + }
  71 + }
78 72 }
79   - }
80   -])
81   -export const { allSchemas } = useCrudSchemas(crudSchemas)
  73 + ]
  74 +})
  75 +export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
... ...
yudao-ui-admin-vue3/src/views/pay/app/index.vue
  1 +<template>
  2 + <ContentWrap>
  3 + <!-- 列表 -->
  4 + <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar">
  5 + <template #toolbar_buttons>
  6 + <!-- 操作:新增 -->
  7 + <XButton
  8 + type="primary"
  9 + preIcon="ep:zoom-in"
  10 + :title="t('action.add')"
  11 + v-hasPermi="['pay:app:create']"
  12 + @click="handleCreate()"
  13 + />
  14 + <!-- 操作:导出 -->
  15 + <XButton
  16 + type="warning"
  17 + preIcon="ep:download"
  18 + :title="t('action.export')"
  19 + v-hasPermi="['pay:app:export']"
  20 + @click="handleExport()"
  21 + />
  22 + </template>
  23 + <template #actionbtns_default="{ row }">
  24 + <!-- 操作:修改 -->
  25 + <XTextButton
  26 + preIcon="ep:edit"
  27 + :title="t('action.edit')"
  28 + v-hasPermi="['pay:app:update']"
  29 + @click="handleUpdate(row.id)"
  30 + />
  31 + <!-- 操作:详情 -->
  32 + <XTextButton
  33 + preIcon="ep:view"
  34 + :title="t('action.detail')"
  35 + v-hasPermi="['pay:app:query']"
  36 + @click="handleDetail(row.id)"
  37 + />
  38 + <!-- 操作:删除 -->
  39 + <XTextButton
  40 + preIcon="ep:delete"
  41 + :title="t('action.del')"
  42 + v-hasPermi="['pay:app:delete']"
  43 + @click="handleDelete(row.id)"
  44 + />
  45 + </template>
  46 + </vxe-grid>
  47 + </ContentWrap>
  48 +
  49 + <XModal v-model="dialogVisible" :title="dialogTitle">
  50 + <!-- 对话框(添加 / 修改) -->
  51 + <Form
  52 + v-if="['create', 'update'].includes(actionType)"
  53 + :schema="allSchemas.formSchema"
  54 + :rules="rules"
  55 + ref="formRef"
  56 + />
  57 + <!-- 对话框(详情) -->
  58 + <Descriptions
  59 + v-if="actionType === 'detail'"
  60 + :schema="allSchemas.detailSchema"
  61 + :data="detailData"
  62 + />
  63 + <!-- 操作按钮 -->
  64 + <template #footer>
  65 + <!-- 按钮:保存 -->
  66 + <XButton
  67 + v-if="['create', 'update'].includes(actionType)"
  68 + type="primary"
  69 + :title="t('action.save')"
  70 + :loading="actionLoading"
  71 + @click="submitForm()"
  72 + />
  73 + <!-- 按钮:关闭 -->
  74 + <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" />
  75 + </template>
  76 + </XModal>
  77 +</template>
1 78 <script setup lang="ts" name="App">
2 79 import { ref, unref } from 'vue'
3   -import dayjs from 'dayjs'
4   -import { ElMessage } from 'element-plus'
5   -import { DICT_TYPE } from '@/utils/dict'
6   -import { useTable } from '@/hooks/web/useTable'
7 80 import { useI18n } from '@/hooks/web/useI18n'
  81 +import { useMessage } from '@/hooks/web/useMessage'
  82 +import { useVxeGrid } from '@/hooks/web/useVxeGrid'
  83 +import { VxeGridInstance } from 'vxe-table'
8 84 import { FormExpose } from '@/components/Form'
9   -import type { AppVO } from '@/api/pay/app/types'
10 85 import { rules, allSchemas } from './app.data'
11 86 import * as AppApi from '@/api/pay/app'
  87 +
12 88 const { t } = useI18n() // 国际化
  89 +const message = useMessage() // 消息弹窗
13 90  
14   -// ========== 列表相关 ==========
15   -const { register, tableObject, methods } = useTable<AppVO>({
  91 +// 列表相关的变量
  92 +const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref
  93 +const { gridOptions, getList, deleteData, exportList } = useVxeGrid<AppApi.AppVO>({
  94 + allSchemas: allSchemas,
16 95 getListApi: AppApi.getAppPageApi,
17   - delListApi: AppApi.deleteAppApi,
  96 + deleteApi: AppApi.deleteAppApi,
18 97 exportListApi: AppApi.exportAppApi
19 98 })
20   -const { getList, setSearchParams, delList, exportList } = methods
21 99  
22 100 // ========== CRUD 相关 ==========
23 101 const actionLoading = ref(false) // 遮罩层
... ... @@ -25,6 +103,7 @@ const actionType = ref(&#39;&#39;) // 操作按钮的类型
25 103 const dialogVisible = ref(false) // 是否显示弹出层
26 104 const dialogTitle = ref('edit') // 弹出层标题
27 105 const formRef = ref<FormExpose>() // 表单 Ref
  106 +const detailData = ref() // 详情 Ref
28 107  
29 108 // 设置标题
30 109 const setDialogTile = (type: string) => {
... ... @@ -38,14 +117,31 @@ const handleCreate = () =&gt; {
38 117 setDialogTile('create')
39 118 }
40 119  
  120 +// 导出操作
  121 +const handleExport = async () => {
  122 + await exportList(xGrid, '应用信息.xls')
  123 +}
  124 +
41 125 // 修改操作
42   -const handleUpdate = async (row: AppVO) => {
  126 +const handleUpdate = async (rowId: number) => {
43 127 setDialogTile('update')
44 128 // 设置数据
45   - const res = await AppApi.getAppApi(row.id)
  129 + const res = await AppApi.getAppApi(rowId)
46 130 unref(formRef)?.setValues(res)
47 131 }
48 132  
  133 +// 详情操作
  134 +const handleDetail = async (rowId: number) => {
  135 + setDialogTile('detail')
  136 + const res = await AppApi.getAppApi(rowId)
  137 + detailData.value = res
  138 +}
  139 +
  140 +// 删除操作
  141 +const handleDelete = async (rowId: number) => {
  142 + await deleteData(xGrid, rowId)
  143 +}
  144 +
49 145 // 提交按钮
50 146 const submitForm = async () => {
51 147 const elForm = unref(formRef)?.getElFormRef()
... ... @@ -55,132 +151,21 @@ const submitForm = async () =&gt; {
55 151 actionLoading.value = true
56 152 // 提交请求
57 153 try {
58   - const data = unref(formRef)?.formModel as AppVO
  154 + const data = unref(formRef)?.formModel as AppApi.AppVO
59 155 if (actionType.value === 'create') {
60 156 await AppApi.createAppApi(data)
61   - ElMessage.success(t('common.createSuccess'))
  157 + message.success(t('common.createSuccess'))
62 158 } else {
63 159 await AppApi.updateAppApi(data)
64   - ElMessage.success(t('common.updateSuccess'))
  160 + message.success(t('common.updateSuccess'))
65 161 }
66   - // 操作成功,重新加载列表
67 162 dialogVisible.value = false
68   - await getList()
69 163 } finally {
70 164 actionLoading.value = false
  165 + // 刷新列表
  166 + await getList(xGrid)
71 167 }
72 168 }
73 169 })
74 170 }
75   -
76   -// ========== 详情相关 ==========
77   -const detailRef = ref() // 详情 Ref
78   -
79   -// 详情操作
80   -const handleDetail = async (row: AppVO) => {
81   - // 设置数据
82   - detailRef.value = row
83   - setDialogTile('detail')
84   -}
85   -
86   -// ========== 初始化 ==========
87   -getList()
88 171 </script>
89   -
90   -<template>
91   - <!-- 搜索工作区 -->
92   - <ContentWrap>
93   - <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
94   - </ContentWrap>
95   - <ContentWrap>
96   - <!-- 操作工具栏 -->
97   - <div class="mb-10px">
98   - <el-button type="primary" v-hasPermi="['system:post:create']" @click="handleCreate">
99   - <Icon icon="ep:zoom-in" class="mr-5px" /> {{ t('action.add') }}
100   - </el-button>
101   - <el-button
102   - type="warning"
103   - v-hasPermi="['system:post:export']"
104   - :loading="tableObject.exportLoading"
105   - @click="exportList('应用数据.xls')"
106   - >
107   - <Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
108   - </el-button>
109   - </div>
110   - <!-- 列表 -->
111   - <Table
112   - :columns="allSchemas.tableColumns"
113   - :selection="false"
114   - :data="tableObject.tableList"
115   - :loading="tableObject.loading"
116   - :pagination="{
117   - total: tableObject.total
118   - }"
119   - v-model:pageSize="tableObject.pageSize"
120   - v-model:currentPage="tableObject.currentPage"
121   - @register="register"
122   - >
123   - <template #status="{ row }">
124   - <DictTag :type="DICT_TYPE.COMMON_STATUS" :value="row.status" />
125   - </template>
126   - <template #createTime="{ row }">
127   - <span>{{ dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</span>
128   - </template>
129   - <template #action="{ row }">
130   - <el-button
131   - link
132   - type="primary"
133   - v-hasPermi="['system:post:update']"
134   - @click="handleUpdate(row)"
135   - >
136   - <Icon icon="ep:edit" class="mr-1px" /> {{ t('action.edit') }}
137   - </el-button>
138   - <el-button
139   - link
140   - type="primary"
141   - v-hasPermi="['system:post:update']"
142   - @click="handleDetail(row)"
143   - >
144   - <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }}
145   - </el-button>
146   - <el-button
147   - link
148   - type="primary"
149   - v-hasPermi="['system:post:delete']"
150   - @click="delList(row.id, false)"
151   - >
152   - <Icon icon="ep:delete" class="mr-1px" /> {{ t('action.del') }}
153   - </el-button>
154   - </template>
155   - </Table>
156   - </ContentWrap>
157   -
158   - <XModal v-model="dialogVisible" :title="dialogTitle">
159   - <!-- 对话框(添加 / 修改) -->
160   - <Form
161   - v-if="['create', 'update'].includes(actionType)"
162   - :schema="allSchemas.formSchema"
163   - :rules="rules"
164   - ref="formRef"
165   - />
166   - <!-- 对话框(详情) -->
167   - <Descriptions
168   - v-if="actionType === 'detail'"
169   - :schema="allSchemas.detailSchema"
170   - :data="detailRef"
171   - />
172   - <!-- 操作按钮 -->
173   - <template #footer>
174   - <!-- 按钮:保存 -->
175   - <XButton
176   - v-if="['create', 'update'].includes(actionType)"
177   - type="primary"
178   - :title="t('action.save')"
179   - :loading="actionLoading"
180   - @click="submitForm()"
181   - />
182   - <!-- 按钮:关闭 -->
183   - <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" />
184   - </template>
185   - </XModal>
186   -</template>
... ...
yudao-ui-admin-vue3/src/views/pay/merchant/index.vue
  1 +<template>
  2 + <ContentWrap>
  3 + <!-- 列表 -->
  4 + <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar">
  5 + <template #toolbar_buttons>
  6 + <!-- 操作:新增 -->
  7 + <XButton
  8 + type="primary"
  9 + preIcon="ep:zoom-in"
  10 + :title="t('action.add')"
  11 + v-hasPermi="['pay:merchant:create']"
  12 + @click="handleCreate()"
  13 + />
  14 + <!-- 操作:导出 -->
  15 + <XButton
  16 + type="warning"
  17 + preIcon="ep:download"
  18 + :title="t('action.export')"
  19 + v-hasPermi="['pay:merchant:export']"
  20 + @click="handleExport()"
  21 + />
  22 + </template>
  23 + <template #actionbtns_default="{ row }">
  24 + <!-- 操作:修改 -->
  25 + <XTextButton
  26 + preIcon="ep:edit"
  27 + :title="t('action.edit')"
  28 + v-hasPermi="['pay:merchant:update']"
  29 + @click="handleUpdate(row.id)"
  30 + />
  31 + <!-- 操作:详情 -->
  32 + <XTextButton
  33 + preIcon="ep:view"
  34 + :title="t('action.detail')"
  35 + v-hasPermi="['pay:merchant:query']"
  36 + @click="handleDetail(row.id)"
  37 + />
  38 + <!-- 操作:删除 -->
  39 + <XTextButton
  40 + preIcon="ep:delete"
  41 + :title="t('action.del')"
  42 + v-hasPermi="['pay:merchant:delete']"
  43 + @click="handleDelete(row.id)"
  44 + />
  45 + </template>
  46 + </vxe-grid>
  47 + </ContentWrap>
  48 + <XModal v-model="dialogVisible" :title="dialogTitle">
  49 + <!-- 对话框(添加 / 修改) -->
  50 + <Form
  51 + v-if="['create', 'update'].includes(actionType)"
  52 + :schema="allSchemas.formSchema"
  53 + :rules="rules"
  54 + ref="formRef"
  55 + />
  56 + <!-- 对话框(详情) -->
  57 + <Descriptions
  58 + v-if="actionType === 'detail'"
  59 + :schema="allSchemas.detailSchema"
  60 + :data="detailData"
  61 + />
  62 + <!-- 操作按钮 -->
  63 + <template #footer>
  64 + <!-- 按钮:保存 -->
  65 + <XButton
  66 + v-if="['create', 'update'].includes(actionType)"
  67 + type="primary"
  68 + :title="t('action.save')"
  69 + :loading="actionLoading"
  70 + @click="submitForm()"
  71 + />
  72 + <!-- 按钮:关闭 -->
  73 + <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" />
  74 + </template>
  75 + </XModal>
  76 +</template>
1 77 <script setup lang="ts" name="Merchant">
2 78 import { ref, unref } from 'vue'
3   -import dayjs from 'dayjs'
4   -import { ElMessage } from 'element-plus'
5   -import { DICT_TYPE } from '@/utils/dict'
6   -import { useTable } from '@/hooks/web/useTable'
7 79 import { useI18n } from '@/hooks/web/useI18n'
  80 +import { useMessage } from '@/hooks/web/useMessage'
  81 +import { useVxeGrid } from '@/hooks/web/useVxeGrid'
  82 +import { VxeGridInstance } from 'vxe-table'
8 83 import { FormExpose } from '@/components/Form'
9   -import type { MerchantVO } from '@/api/pay/merchant/types'
10 84 import { rules, allSchemas } from './merchant.data'
11 85 import * as MerchantApi from '@/api/pay/merchant'
12   -const { t } = useI18n() // 国际化
13 86  
14   -// ========== 列表相关 ==========
15   -const { register, tableObject, methods } = useTable<MerchantVO>({
  87 +const { t } = useI18n() // 国际化
  88 +const message = useMessage() // 消息弹窗
  89 +// 列表相关的变量
  90 +const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref
  91 +const { gridOptions, getList, deleteData, exportList } = useVxeGrid<MerchantApi.MerchantVO>({
  92 + allSchemas: allSchemas,
16 93 getListApi: MerchantApi.getMerchantPageApi,
17   - delListApi: MerchantApi.deleteMerchantApi,
  94 + deleteApi: MerchantApi.deleteMerchantApi,
18 95 exportListApi: MerchantApi.exportMerchantApi
19 96 })
20   -const { getList, setSearchParams, delList, exportList } = methods
21 97  
22 98 // ========== CRUD 相关 ==========
23 99 const actionLoading = ref(false) // 遮罩层
... ... @@ -25,6 +101,7 @@ const actionType = ref(&#39;&#39;) // 操作按钮的类型
25 101 const dialogVisible = ref(false) // 是否显示弹出层
26 102 const dialogTitle = ref('edit') // 弹出层标题
27 103 const formRef = ref<FormExpose>() // 表单 Ref
  104 +const detailData = ref() // 详情 Ref
28 105  
29 106 // 设置标题
30 107 const setDialogTile = (type: string) => {
... ... @@ -38,14 +115,31 @@ const handleCreate = () =&gt; {
38 115 setDialogTile('create')
39 116 }
40 117  
  118 +// 导出操作
  119 +const handleExport = async () => {
  120 + await exportList(xGrid, '商户列表.xls')
  121 +}
  122 +
41 123 // 修改操作
42   -const handleUpdate = async (row: MerchantVO) => {
  124 +const handleUpdate = async (rowId: number) => {
43 125 setDialogTile('update')
44 126 // 设置数据
45   - const res = await MerchantApi.getMerchantApi(row.id)
  127 + const res = await MerchantApi.getMerchantApi(rowId)
46 128 unref(formRef)?.setValues(res)
47 129 }
48 130  
  131 +// 详情操作
  132 +const handleDetail = async (rowId: number) => {
  133 + setDialogTile('detail')
  134 + const res = await MerchantApi.getMerchantApi(rowId)
  135 + detailData.value = res
  136 +}
  137 +
  138 +// 删除操作
  139 +const handleDelete = async (rowId: number) => {
  140 + await deleteData(xGrid, rowId)
  141 +}
  142 +
49 143 // 提交按钮
50 144 const submitForm = async () => {
51 145 const elForm = unref(formRef)?.getElFormRef()
... ... @@ -55,132 +149,21 @@ const submitForm = async () =&gt; {
55 149 actionLoading.value = true
56 150 // 提交请求
57 151 try {
58   - const data = unref(formRef)?.formModel as MerchantVO
  152 + const data = unref(formRef)?.formModel as MerchantApi.MerchantVO
59 153 if (actionType.value === 'create') {
60 154 await MerchantApi.createMerchantApi(data)
61   - ElMessage.success(t('common.createSuccess'))
  155 + message.success(t('common.createSuccess'))
62 156 } else {
63 157 await MerchantApi.updateMerchantApi(data)
64   - ElMessage.success(t('common.updateSuccess'))
  158 + message.success(t('common.updateSuccess'))
65 159 }
66   - // 操作成功,重新加载列表
67 160 dialogVisible.value = false
68   - await getList()
69 161 } finally {
70 162 actionLoading.value = false
  163 + // 刷新列表
  164 + await getList(xGrid)
71 165 }
72 166 }
73 167 })
74 168 }
75   -
76   -// ========== 详情相关 ==========
77   -const detailRef = ref() // 详情 Ref
78   -
79   -// 详情操作
80   -const handleDetail = async (row: MerchantVO) => {
81   - // 设置数据
82   - detailRef.value = row
83   - setDialogTile('detail')
84   -}
85   -
86   -// ========== 初始化 ==========
87   -getList()
88 169 </script>
89   -
90   -<template>
91   - <!-- 搜索工作区 -->
92   - <ContentWrap>
93   - <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
94   - </ContentWrap>
95   - <ContentWrap>
96   - <!-- 操作工具栏 -->
97   - <div class="mb-10px">
98   - <el-button type="primary" v-hasPermi="['system:post:create']" @click="handleCreate">
99   - <Icon icon="ep:zoom-in" class="mr-5px" /> {{ t('action.add') }}
100   - </el-button>
101   - <el-button
102   - type="warning"
103   - v-hasPermi="['system:post:export']"
104   - :loading="tableObject.exportLoading"
105   - @click="exportList('商户数据.xls')"
106   - >
107   - <Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
108   - </el-button>
109   - </div>
110   - <!-- 列表 -->
111   - <Table
112   - :columns="allSchemas.tableColumns"
113   - :selection="false"
114   - :data="tableObject.tableList"
115   - :loading="tableObject.loading"
116   - :pagination="{
117   - total: tableObject.total
118   - }"
119   - v-model:pageSize="tableObject.pageSize"
120   - v-model:currentPage="tableObject.currentPage"
121   - @register="register"
122   - >
123   - <template #status="{ row }">
124   - <DictTag :type="DICT_TYPE.COMMON_STATUS" :value="row.status" />
125   - </template>
126   - <template #createTime="{ row }">
127   - <span>{{ dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</span>
128   - </template>
129   - <template #action="{ row }">
130   - <el-button
131   - link
132   - type="primary"
133   - v-hasPermi="['system:post:update']"
134   - @click="handleUpdate(row)"
135   - >
136   - <Icon icon="ep:edit" class="mr-1px" /> {{ t('action.edit') }}
137   - </el-button>
138   - <el-button
139   - link
140   - type="primary"
141   - v-hasPermi="['system:post:update']"
142   - @click="handleDetail(row)"
143   - >
144   - <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }}
145   - </el-button>
146   - <el-button
147   - link
148   - type="primary"
149   - v-hasPermi="['system:post:delete']"
150   - @click="delList(row.id, false)"
151   - >
152   - <Icon icon="ep:delete" class="mr-1px" /> {{ t('action.del') }}
153   - </el-button>
154   - </template>
155   - </Table>
156   - </ContentWrap>
157   -
158   - <XModal v-model="dialogVisible" :title="dialogTitle">
159   - <!-- 对话框(添加 / 修改) -->
160   - <Form
161   - v-if="['create', 'update'].includes(actionType)"
162   - :schema="allSchemas.formSchema"
163   - :rules="rules"
164   - ref="formRef"
165   - />
166   - <!-- 对话框(详情) -->
167   - <Descriptions
168   - v-if="actionType === 'detail'"
169   - :schema="allSchemas.detailSchema"
170   - :data="detailRef"
171   - />
172   - <!-- 操作按钮 -->
173   - <template #footer>
174   - <!-- 按钮:保存 -->
175   - <XButton
176   - v-if="['create', 'update'].includes(actionType)"
177   - type="primary"
178   - :title="t('action.save')"
179   - :loading="actionLoading"
180   - @click="submitForm()"
181   - />
182   - <!-- 按钮:关闭 -->
183   - <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" />
184   - </template>
185   - </XModal>
186   -</template>
... ...
yudao-ui-admin-vue3/src/views/pay/merchant/merchant.data.ts
1 1 import { reactive } from 'vue'
2 2 import { useI18n } from '@/hooks/web/useI18n'
3 3 import { required } from '@/utils/formRules'
4   -import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas'
5 4 import { DICT_TYPE } from '@/utils/dict'
  5 +import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
6 6 const { t } = useI18n() // 国际化
7 7  
8 8 // 表单校验
... ... @@ -14,91 +14,61 @@ export const rules = reactive({
14 14 })
15 15  
16 16 // CrudSchema
17   -const crudSchemas = reactive<CrudSchema[]>([
18   - {
19   - label: t('common.index'),
20   - field: 'id',
21   - type: 'index',
22   - form: {
23   - show: false
  17 +const crudSchemas = reactive<VxeCrudSchema>({
  18 + primaryKey: 'id',
  19 + primaryType: 'seq',
  20 + primaryTitle: '商户编号',
  21 + action: true,
  22 + columns: [
  23 + {
  24 + title: '商户号',
  25 + field: 'no',
  26 + isSearch: true
24 27 },
25   - detail: {
26   - show: false
27   - }
28   - },
29   - {
30   - label: '商户号',
31   - field: 'no',
32   - search: {
33   - show: true
34   - }
35   - },
36   - {
37   - label: '商户全称',
38   - field: 'code',
39   - search: {
40   - show: true
41   - }
42   - },
43   - {
44   - label: '商户简称',
45   - field: 'shortName',
46   - search: {
47   - show: true
48   - }
49   - },
50   - {
51   - label: t('common.status'),
52   - field: 'status',
53   - dictType: DICT_TYPE.COMMON_STATUS,
54   - dictClass: 'number',
55   - search: {
56   - show: true
57   - }
58   - },
59   - {
60   - label: t('form.remark'),
61   - field: 'remark',
62   - form: {
63   - component: 'Input',
64   - componentProps: {
65   - type: 'textarea',
66   - rows: 4
67   - },
68   - colProps: {
69   - span: 24
70   - }
  28 + {
  29 + title: '商户全称',
  30 + field: 'code',
  31 + isSearch: true
71 32 },
72   - table: {
73   - show: false
74   - }
75   - },
76   - {
77   - label: t('common.createTime'),
78   - field: 'createTime',
79   - form: {
80   - show: false
  33 + {
  34 + title: '商户简称',
  35 + field: 'shortName',
  36 + isSearch: true
  37 + },
  38 + {
  39 + title: t('common.status'),
  40 + field: 'status',
  41 + dictType: DICT_TYPE.COMMON_STATUS,
  42 + dictClass: 'number',
  43 + isSearch: true
81 44 },
82   - search: {
83   - show: true,
84   - component: 'DatePicker',
85   - componentProps: {
86   - type: 'datetimerange',
87   - valueFormat: 'YYYY-MM-DD HH:mm:ss',
88   - defaultTime: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)]
  45 + {
  46 + title: t('form.remark'),
  47 + field: 'remark',
  48 + isTable: false,
  49 + form: {
  50 + component: 'Input',
  51 + componentProps: {
  52 + type: 'textarea',
  53 + rows: 4
  54 + },
  55 + colProps: {
  56 + span: 24
  57 + }
89 58 }
90   - }
91   - },
92   - {
93   - label: t('table.action'),
94   - field: 'action',
95   - width: '240px',
96   - form: {
97   - show: false
98 59 },
99   - detail: {
100   - show: false
  60 + {
  61 + title: t('common.createTime'),
  62 + field: 'createTime',
  63 + formatter: 'formatDate',
  64 + isForm: false,
  65 + search: {
  66 + show: true,
  67 + itemRender: {
  68 + name: 'XDataTimePicker'
  69 + }
  70 + }
101 71 }
102   - }
103   -])
104   -export const { allSchemas } = useCrudSchemas(crudSchemas)
  72 + ]
  73 +})
  74 +export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
... ...
yudao-ui-admin-vue3/src/views/pay/order/index.vue
  1 +<template>
  2 + <ContentWrap>
  3 + <!-- 列表 -->
  4 + <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar">
  5 + <template #toolbar_buttons>
  6 + <!-- 操作:新增 -->
  7 + <XButton
  8 + type="primary"
  9 + preIcon="ep:zoom-in"
  10 + :title="t('action.add')"
  11 + v-hasPermi="['pay:order:create']"
  12 + @click="handleCreate()"
  13 + />
  14 + <!-- 操作:导出 -->
  15 + <XButton
  16 + type="warning"
  17 + preIcon="ep:download"
  18 + :title="t('action.export')"
  19 + v-hasPermi="['pay:order:export']"
  20 + @click="handleExport()"
  21 + />
  22 + </template>
  23 + <template #actionbtns_default="{ row }">
  24 + <!-- 操作:详情 -->
  25 + <XTextButton
  26 + preIcon="ep:view"
  27 + :title="t('action.detail')"
  28 + v-hasPermi="['pay:order:query']"
  29 + @click="handleDetail(row.id)"
  30 + />
  31 + </template>
  32 + </vxe-grid>
  33 + </ContentWrap>
  34 + <XModal v-model="dialogVisible" :title="dialogTitle">
  35 + <!-- 对话框(详情) -->
  36 + <Descriptions :schema="allSchemas.detailSchema" :data="detailData" />
  37 + <!-- 操作按钮 -->
  38 + <template #footer>
  39 + <!-- 按钮:关闭 -->
  40 + <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" />
  41 + </template>
  42 + </XModal>
  43 +</template>
1 44 <script setup lang="ts" name="Order">
2   -import { ref, unref } from 'vue'
3   -import { ElMessage } from 'element-plus'
4   -import { DICT_TYPE } from '@/utils/dict'
5   -import { useTable } from '@/hooks/web/useTable'
  45 +import { ref } from 'vue'
6 46 import { useI18n } from '@/hooks/web/useI18n'
7   -import { FormExpose } from '@/components/Form'
8   -import type { OrderVO } from '@/api/pay/order/types'
9   -import { rules, allSchemas } from './order.data'
  47 +import { useVxeGrid } from '@/hooks/web/useVxeGrid'
  48 +import { VxeGridInstance } from 'vxe-table'
  49 +import { allSchemas } from './order.data'
10 50 import * as OrderApi from '@/api/pay/order'
  51 +
11 52 const { t } = useI18n() // 国际化
12   -// ========== 列表相关 ==========
13   -const { register, tableObject, methods } = useTable<OrderVO>({
  53 +// 列表相关的变量
  54 +const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref
  55 +const { gridOptions, exportList } = useVxeGrid<OrderApi.OrderVO>({
  56 + allSchemas: allSchemas,
14 57 getListApi: OrderApi.getOrderPageApi,
15   - delListApi: OrderApi.deleteOrderApi,
16 58 exportListApi: OrderApi.exportOrderApi
17 59 })
18   -const { getList, setSearchParams, delList, exportList } = methods
19 60 // ========== CRUD 相关 ==========
20 61 const actionLoading = ref(false) // 遮罩层
21 62 const actionType = ref('') // 操作按钮的类型
22 63 const dialogVisible = ref(false) // 是否显示弹出层
23 64 const dialogTitle = ref('edit') // 弹出层标题
24   -const formRef = ref<FormExpose>() // 表单 Ref
25   -
  65 +const detailData = ref() // 详情 Ref
26 66 // 设置标题
27 67 const setDialogTile = (type: string) => {
28 68 dialogTitle.value = t('action.' + type)
... ... @@ -34,137 +74,15 @@ const setDialogTile = (type: string) =&gt; {
34 74 const handleCreate = () => {
35 75 setDialogTile('create')
36 76 }
37   -
38   -// 修改操作
39   -const handleUpdate = async (row: OrderVO) => {
40   - setDialogTile('update')
41   - // 设置数据
42   - const res = await OrderApi.getOrderApi(row.id)
43   - unref(formRef)?.setValues(res)
44   -}
45   -
46   -// 提交按钮
47   -const submitForm = async () => {
48   - const elForm = unref(formRef)?.getElFormRef()
49   - if (!elForm) return
50   - elForm.validate(async (valid) => {
51   - if (valid) {
52   - actionLoading.value = true
53   - // 提交请求
54   - try {
55   - const data = unref(formRef)?.formModel as OrderVO
56   - if (actionType.value === 'create') {
57   - await OrderApi.createOrderApi(data)
58   - ElMessage.success(t('common.createSuccess'))
59   - } else {
60   - await OrderApi.updateOrderApi(data)
61   - ElMessage.success(t('common.updateSuccess'))
62   - }
63   - // 操作成功,重新加载列表
64   - dialogVisible.value = false
65   - await getList()
66   - } finally {
67   - actionLoading.value = false
68   - }
69   - }
70   - })
  77 +// 导出操作
  78 +const handleExport = async () => {
  79 + await exportList(xGrid, '订单数据.xls')
71 80 }
72 81  
73   -// ========== 详情相关 ==========
74   -const detailRef = ref() // 详情 Ref
75   -
76 82 // 详情操作
77   -const handleDetail = async (row: OrderVO) => {
  83 +const handleDetail = async (rowId: number) => {
78 84 setDialogTile('detail')
79   - // 设置数据
80   - const res = await OrderApi.getOrderApi(row.id as number)
81   - detailRef.value = res
  85 + const res = await OrderApi.getOrderApi(rowId)
  86 + detailData.value = res
82 87 }
83   -
84   -// ========== 初始化 ==========
85   -getList()
86 88 </script>
87   -<template>
88   - <!-- 搜索工作区 -->
89   - <ContentWrap>
90   - <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
91   - </ContentWrap>
92   - <ContentWrap>
93   - <!-- 操作工具栏 -->
94   - <div class="mb-10px">
95   - <el-button type="primary" v-hasPermi="['pay:order:create']" @click="handleCreate">
96   - <Icon icon="ep:zoom-in" class="mr-5px" /> {{ t('action.add') }}
97   - </el-button>
98   - <el-button
99   - type="warning"
100   - v-hasPermi="['pay:order:export']"
101   - :loading="tableObject.exportLoading"
102   - @click="exportList('订单数据.xls')"
103   - >
104   - <Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
105   - </el-button>
106   - </div>
107   - <!-- 列表 -->
108   - <Table
109   - :columns="allSchemas.tableColumns"
110   - :selection="false"
111   - :data="tableObject.tableList"
112   - :loading="tableObject.loading"
113   - :pagination="{
114   - total: tableObject.total
115   - }"
116   - v-model:pageSize="tableObject.pageSize"
117   - v-model:currentPage="tableObject.currentPage"
118   - @register="register"
119   - >
120   - <template #status="{ row }">
121   - <DictTag :type="DICT_TYPE.COMMON_STATUS" :value="row.status" />
122   - </template>
123   - <template #action="{ row }">
124   - <el-button link type="primary" v-hasPermi="['pay:order:update']" @click="handleUpdate(row)">
125   - <Icon icon="ep:edit" class="mr-1px" /> {{ t('action.edit') }}
126   - </el-button>
127   - <el-button link type="primary" v-hasPermi="['pay:order:update']" @click="handleDetail(row)">
128   - <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }}
129   - </el-button>
130   - <el-button
131   - link
132   - type="primary"
133   - v-hasPermi="['pay:order:delete']"
134   - @click="delList(row.id, false)"
135   - >
136   - <Icon icon="ep:delete" class="mr-1px" /> {{ t('action.del') }}
137   - </el-button>
138   - </template>
139   - </Table>
140   - </ContentWrap>
141   -
142   - <XModal v-model="dialogVisible" :title="dialogTitle">
143   - <!-- 对话框(添加 / 修改) -->
144   - <Form
145   - v-if="['create', 'update'].includes(actionType)"
146   - :schema="allSchemas.formSchema"
147   - :rules="rules"
148   - ref="formRef"
149   - />
150   - <!-- 对话框(详情) -->
151   - <Descriptions
152   - v-if="actionType === 'detail'"
153   - :schema="allSchemas.detailSchema"
154   - :data="detailRef"
155   - />
156   - <!-- 操作按钮 -->
157   - <template #footer>
158   - <!-- 按钮:保存 -->
159   - <XButton
160   - v-if="['create', 'update'].includes(actionType)"
161   - type="primary"
162   - :title="t('action.save')"
163   - :loading="actionLoading"
164   - @click="submitForm()"
165   - />
166   - <!-- 按钮:关闭 -->
167   - <XButton :loading="actionLoading" :title="t('dialog.close')" @click="dialogVisible = false" />
168   - </template>
169   - </XModal>
170   -</template>
... ...
yudao-ui-admin-vue3/src/views/pay/order/order.data.ts
1 1 import { reactive } from 'vue'
2 2 import { useI18n } from '@/hooks/web/useI18n'
3 3 import { required } from '@/utils/formRules'
4   -import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas'
5 4 import { DICT_TYPE } from '@/utils/dict'
  5 +import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
6 6 const { t } = useI18n() // 国际化
7 7  
8 8 // 表单校验
... ... @@ -23,166 +23,134 @@ export const rules = reactive({
23 23 refundAmount: [required]
24 24 })
25 25 // CrudSchema
26   -const crudSchemas = reactive<CrudSchema[]>([
27   - {
28   - label: t('common.index'),
29   - field: 'id',
30   - type: 'index',
31   - form: {
32   - show: false
33   - },
34   - detail: {
35   - show: false
36   - }
37   - },
38   - {
39   - label: '商户编号',
40   - field: 'merchantId',
41   - search: {
42   - show: true
43   - }
44   - },
45   - {
46   - label: '应用编号',
47   - field: 'appId',
48   - search: {
49   - show: true
50   - }
51   - },
52   - {
53   - label: '渠道编号',
54   - field: 'channelId'
55   - },
56   - {
57   - label: '渠道编码',
58   - field: 'channelCode',
59   - search: {
60   - show: true
61   - }
62   - },
63   - {
64   - label: '渠道订单号',
65   - field: 'merchantOrderId',
66   - search: {
67   - show: true
68   - }
69   - },
70   - {
71   - label: '商品标题',
72   - field: 'subject'
73   - },
74   - {
75   - label: '商品描述',
76   - field: 'body'
77   - },
78   - {
79   - label: '异步通知地址',
80   - field: 'notifyUrl'
81   - },
82   - {
83   - label: '回调商户状态',
84   - field: 'notifyStatus',
85   - dictType: DICT_TYPE.PAY_ORDER_NOTIFY_STATUS,
86   - dictClass: 'number'
87   - },
88   - {
89   - label: '支付金额',
90   - field: 'amount',
91   - search: {
92   - show: true
93   - }
94   - },
95   - {
96   - label: '渠道手续费',
97   - field: 'channelFeeRate',
98   - search: {
99   - show: true
100   - }
101   - },
102   - {
103   - label: '渠道手续金额',
104   - field: 'channelFeeAmount',
105   - search: {
106   - show: true
107   - }
108   - },
109   - {
110   - label: '支付状态',
111   - field: 'status',
112   - dictType: DICT_TYPE.PAY_ORDER_STATUS,
113   - dictClass: 'number',
114   - search: {
115   - show: true
116   - }
117   - },
118   - {
119   - label: '用户 IP',
120   - field: 'userIp'
121   - },
122   - {
123   - label: '订单失效时间',
124   - field: 'expireTime'
125   - },
126   - {
127   - label: '订单支付成功时间',
128   - field: 'successTime'
129   - },
130   - {
131   - label: '订单支付通知时间',
132   - field: 'notifyTime'
133   - },
134   - {
135   - label: '支付成功的订单拓展单编号',
136   - field: 'successExtensionId'
137   - },
138   - {
139   - label: '退款状态',
140   - field: 'refundStatus',
141   - dictType: DICT_TYPE.PAY_ORDER_REFUND_STATUS,
142   - dictClass: 'number',
143   - search: {
144   - show: true
145   - }
146   - },
147   - {
148   - label: '退款次数',
149   - field: 'refundTimes'
150   - },
151   - {
152   - label: '退款总金额',
153   - field: 'refundAmount'
154   - },
155   - {
156   - label: '渠道用户编号',
157   - field: 'channelUserId'
158   - },
159   - {
160   - label: '渠道订单号',
161   - field: 'channelOrderNo'
162   - },
163   - {
164   - label: t('common.createTime'),
165   - field: 'createTime',
166   - form: {
167   - show: false
168   - },
169   - search: {
170   - show: true,
171   - component: 'DatePicker',
172   - componentProps: {
173   - type: 'datetimerange',
174   - valueFormat: 'YYYY-MM-DD HH:mm:ss',
175   - defaultTime: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)]
  26 +const crudSchemas = reactive<VxeCrudSchema>({
  27 + primaryKey: 'id',
  28 + primaryType: 'seq',
  29 + primaryTitle: '岗位编号',
  30 + action: true,
  31 + columns: [
  32 + {
  33 + title: '商户编号',
  34 + field: 'merchantId',
  35 + isSearch: true
  36 + },
  37 + {
  38 + title: '应用编号',
  39 + field: 'appId',
  40 + isSearch: true
  41 + },
  42 + {
  43 + title: '渠道编号',
  44 + field: 'channelId'
  45 + },
  46 + {
  47 + title: '渠道编码',
  48 + field: 'channelCode',
  49 + isSearch: true
  50 + },
  51 + {
  52 + title: '渠道订单号',
  53 + field: 'merchantOrderId',
  54 + isSearch: true
  55 + },
  56 + {
  57 + title: '商品标题',
  58 + field: 'subject'
  59 + },
  60 + {
  61 + title: '商品描述',
  62 + field: 'body'
  63 + },
  64 + {
  65 + title: '异步通知地址',
  66 + field: 'notifyUrl'
  67 + },
  68 + {
  69 + title: '回调状态',
  70 + field: 'notifyStatus',
  71 + dictType: DICT_TYPE.PAY_ORDER_NOTIFY_STATUS,
  72 + dictClass: 'number'
  73 + },
  74 + {
  75 + title: '支付金额',
  76 + field: 'amount',
  77 + isSearch: true
  78 + },
  79 + {
  80 + title: '渠道手续费',
  81 + field: 'channelFeeRate',
  82 + isSearch: true
  83 + },
  84 + {
  85 + title: '渠道手续金额',
  86 + field: 'channelFeeAmount',
  87 + isSearch: true
  88 + },
  89 + {
  90 + title: '支付状态',
  91 + field: 'status',
  92 + dictType: DICT_TYPE.PAY_ORDER_STATUS,
  93 + dictClass: 'number',
  94 + isSearch: true
  95 + },
  96 + {
  97 + title: '用户 IP',
  98 + field: 'userIp'
  99 + },
  100 + {
  101 + title: '订单失效时间',
  102 + field: 'expireTime',
  103 + formatter: 'formatDate'
  104 + },
  105 + {
  106 + title: '支付时间',
  107 + field: 'successTime',
  108 + formatter: 'formatDate'
  109 + },
  110 + {
  111 + title: '支付通知时间',
  112 + field: 'notifyTime',
  113 + formatter: 'formatDate'
  114 + },
  115 + {
  116 + title: '拓展编号',
  117 + field: 'successExtensionId'
  118 + },
  119 + {
  120 + title: '退款状态',
  121 + field: 'refundStatus',
  122 + dictType: DICT_TYPE.PAY_ORDER_REFUND_STATUS,
  123 + dictClass: 'number',
  124 + isSearch: true
  125 + },
  126 + {
  127 + title: '退款次数',
  128 + field: 'refundTimes'
  129 + },
  130 + {
  131 + title: '退款总金额',
  132 + field: 'refundAmount'
  133 + },
  134 + {
  135 + title: '渠道用户编号',
  136 + field: 'channelUserId'
  137 + },
  138 + {
  139 + title: '渠道订单号',
  140 + field: 'channelOrderNo'
  141 + },
  142 + {
  143 + title: t('common.createTime'),
  144 + field: 'createTime',
  145 + formatter: 'formatDate',
  146 + isForm: false,
  147 + search: {
  148 + show: true,
  149 + itemRender: {
  150 + name: 'XDataTimePicker'
  151 + }
176 152 }
177 153 }
178   - },
179   - {
180   - label: t('table.action'),
181   - field: 'action',
182   - width: '270px',
183   - form: {
184   - show: false
185   - }
186   - }
187   -])
188   -export const { allSchemas } = useCrudSchemas(crudSchemas)
  154 + ]
  155 +})
  156 +export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
... ...
yudao-ui-admin-vue3/src/views/pay/refund/index.vue
  1 +<template>
  2 + <ContentWrap>
  3 + <!-- 列表 -->
  4 + <vxe-grid ref="xGrid" v-bind="gridOptions" class="xtable-scrollbar">
  5 + <template #toolbar_buttons>
  6 + <!-- 操作:导出 -->
  7 + <XButton
  8 + type="warning"
  9 + preIcon="ep:download"
  10 + :title="t('action.export')"
  11 + v-hasPermi="['pay:refund:export']"
  12 + @click="handleExport()"
  13 + />
  14 + </template>
  15 + <template #actionbtns_default="{ row }">
  16 + <!-- 操作:详情 -->
  17 + <XTextButton
  18 + preIcon="ep:view"
  19 + :title="t('action.detail')"
  20 + v-hasPermi="['pay:refund:query']"
  21 + @click="handleDetail(row.id)"
  22 + />
  23 + </template>
  24 + </vxe-grid>
  25 + </ContentWrap>
  26 +
  27 + <XModal v-model="dialogVisible" :title="t('action.detail')">
  28 + <!-- 对话框(详情) -->
  29 + <Descriptions :schema="allSchemas.detailSchema" :data="detailData" />
  30 + <!-- 操作按钮 -->
  31 + <template #footer>
  32 + <el-button @click="dialogVisible = false">{{ t('dialog.close') }}</el-button>
  33 + </template>
  34 + </XModal>
  35 +</template>
1 36 <script setup lang="ts" name="Refund">
2 37 import { ref } from 'vue'
3   -import dayjs from 'dayjs'
4   -import { DICT_TYPE } from '@/utils/dict'
5   -import { useTable } from '@/hooks/web/useTable'
6 38 import { useI18n } from '@/hooks/web/useI18n'
7   -import type { RefundVO } from '@/api/pay/refund/types'
  39 +import { useVxeGrid } from '@/hooks/web/useVxeGrid'
  40 +import { VxeGridInstance } from 'vxe-table'
8 41 import { allSchemas } from './refund.data'
9 42 import * as RefundApi from '@/api/pay/refund'
  43 +
10 44 const { t } = useI18n() // 国际化
11 45  
12   -// ========== 列表相关 ==========
13   -const { register, tableObject, methods } = useTable<RefundVO>({
  46 +// 列表相关的变量
  47 +const xGrid = ref<VxeGridInstance>() // 列表 Grid Ref
  48 +const { gridOptions, exportList } = useVxeGrid<RefundApi.RefundVO>({
  49 + allSchemas: allSchemas,
14 50 getListApi: RefundApi.getRefundPageApi,
15   - delListApi: RefundApi.deleteRefundApi,
16 51 exportListApi: RefundApi.exportRefundApi
17 52 })
18   -const { getList, setSearchParams, delList, exportList } = methods
  53 +
  54 +// 导出操作
  55 +const handleExport = async () => {
  56 + await exportList(xGrid, '退款订单.xls')
  57 +}
19 58  
20 59 // ========== CRUD 相关 ==========
21 60 const dialogVisible = ref(false) // 是否显示弹出层
22   -const dialogTitle = ref('edit') // 弹出层标题
23   -
24   -// ========== 详情相关 ==========
25   -const detailRef = ref() // 详情 Ref
  61 +const detailData = ref() // 详情 Ref
26 62  
27 63 // 详情操作
28   -const handleDetail = async (row: RefundVO) => {
  64 +const handleDetail = async (rowId: number) => {
29 65 // 设置数据
30   - detailRef.value = RefundApi.getRefundApi(row.id)
31   - dialogTitle.value = t('action.detail')
  66 + detailData.value = RefundApi.getRefundApi(rowId)
32 67 dialogVisible.value = true
33 68 }
34   -
35   -// ========== 初始化 ==========
36   -getList()
37 69 </script>
38   -
39   -<template>
40   - <!-- 搜索工作区 -->
41   - <ContentWrap>
42   - <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
43   - </ContentWrap>
44   - <ContentWrap>
45   - <!-- 操作工具栏 -->
46   - <div class="mb-10px">
47   - <el-button
48   - type="warning"
49   - v-hasPermi="['system:post:export']"
50   - :loading="tableObject.exportLoading"
51   - @click="exportList('退款订单.xls')"
52   - >
53   - <Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
54   - </el-button>
55   - </div>
56   - <!-- 列表 -->
57   - <Table
58   - :columns="allSchemas.tableColumns"
59   - :selection="false"
60   - :data="tableObject.tableList"
61   - :loading="tableObject.loading"
62   - :pagination="{
63   - total: tableObject.total
64   - }"
65   - v-model:pageSize="tableObject.pageSize"
66   - v-model:currentPage="tableObject.currentPage"
67   - @register="register"
68   - >
69   - <template #status="{ row }">
70   - <DictTag :type="DICT_TYPE.COMMON_STATUS" :value="row.status" />
71   - </template>
72   - <template #createTime="{ row }">
73   - <span>{{ dayjs(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}</span>
74   - </template>
75   - <template #action="{ row }">
76   - <el-button
77   - link
78   - type="primary"
79   - v-hasPermi="['system:post:update']"
80   - @click="handleDetail(row)"
81   - >
82   - <Icon icon="ep:view" class="mr-1px" /> {{ t('action.detail') }}
83   - </el-button>
84   - <el-button
85   - link
86   - type="primary"
87   - v-hasPermi="['system:post:delete']"
88   - @click="delList(row.id, false)"
89   - >
90   - <Icon icon="ep:delete" class="mr-1px" /> {{ t('action.del') }}
91   - </el-button>
92   - </template>
93   - </Table>
94   - </ContentWrap>
95   -
96   - <XModal v-model="dialogVisible" :title="dialogTitle">
97   - <!-- 对话框(详情) -->
98   - <Descriptions :schema="allSchemas.detailSchema" :data="detailRef" />
99   - <!-- 操作按钮 -->
100   - <template #footer>
101   - <el-button @click="dialogVisible = false">{{ t('dialog.close') }}</el-button>
102   - </template>
103   - </XModal>
104   -</template>
... ...
yudao-ui-admin-vue3/src/views/pay/refund/refund.data.ts
1 1 import { reactive } from 'vue'
2 2 import { useI18n } from '@/hooks/web/useI18n'
3   -import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas'
4 3 import { DICT_TYPE } from '@/utils/dict'
  4 +import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
5 5 const { t } = useI18n() // 国际化
6 6  
7 7 // CrudSchema
8   -const crudSchemas = reactive<CrudSchema[]>([
9   - {
10   - label: t('common.index'),
11   - field: 'id',
12   - type: 'index',
13   - form: {
14   - show: false
15   - },
16   - detail: {
17   - show: false
18   - }
19   - },
20   - {
21   - label: '应用编号',
22   - field: 'appId',
23   - search: {
24   - show: true
25   - }
26   - },
27   - {
28   - label: '商户名称',
29   - field: 'merchantName'
30   - },
31   - {
32   - label: '应用名称',
33   - field: 'appName'
34   - },
35   - {
36   - label: '商品名称',
37   - field: 'subject'
38   - },
39   - {
40   - label: '商户退款单号',
41   - field: 'merchantRefundNo'
42   - },
43   - {
44   - label: '商户订单号',
45   - field: 'merchantOrderId'
46   - },
47   - {
48   - label: '交易订单号',
49   - field: 'tradeNo'
50   - },
51   - {
52   - label: '支付金额',
53   - field: 'payAmount'
54   - },
55   - {
56   - label: '退款金额',
57   - field: 'refundAmount'
58   - },
59   - {
60   - label: '渠道编码',
61   - field: 'channelCode',
62   - search: {
63   - show: true
64   - }
65   - },
66   - {
67   - label: '退款类型',
68   - field: 'type',
69   - dictType: DICT_TYPE.PAY_REFUND_ORDER_TYPE,
70   - dictClass: 'number',
71   - search: {
72   - show: true
73   - }
74   - },
75   - {
76   - label: t('common.status'),
77   - field: 'status',
78   - dictType: DICT_TYPE.PAY_REFUND_ORDER_STATUS,
79   - dictClass: 'number',
80   - search: {
81   - show: true
82   - }
83   - },
84   - {
85   - label: t('common.createTime'),
86   - field: 'createTime',
87   - form: {
88   - show: false
89   - },
90   - search: {
91   - show: true,
92   - component: 'DatePicker',
93   - componentProps: {
94   - type: 'datetimerange',
95   - valueFormat: 'YYYY-MM-DD HH:mm:ss',
96   - defaultTime: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)]
  8 +const crudSchemas = reactive<VxeCrudSchema>({
  9 + primaryKey: 'id',
  10 + primaryType: 'seq',
  11 + primaryTitle: '序号',
  12 + action: true,
  13 + columns: [
  14 + {
  15 + title: '商户编号',
  16 + field: 'merchantId',
  17 + isSearch: true
  18 + },
  19 + {
  20 + title: '应用编号',
  21 + field: 'appId',
  22 + isSearch: true
  23 + },
  24 + {
  25 + title: '渠道编号',
  26 + field: 'channelId',
  27 + isSearch: true
  28 + },
  29 + {
  30 + title: '渠道编码',
  31 + field: 'channelCode',
  32 + dictType: DICT_TYPE.PAY_CHANNEL_CODE_TYPE,
  33 + dictClass: 'number',
  34 + isSearch: true
  35 + },
  36 + {
  37 + title: '支付订单编号',
  38 + field: 'orderId',
  39 + isSearch: true
  40 + },
  41 + {
  42 + title: '交易订单号',
  43 + field: 'tradeNo',
  44 + isSearch: true
  45 + },
  46 + {
  47 + title: '商户订单号',
  48 + field: 'merchantOrderId',
  49 + isSearch: true
  50 + },
  51 + {
  52 + title: '商户退款单号',
  53 + field: 'merchantRefundNo',
  54 + isSearch: true
  55 + },
  56 + {
  57 + title: '回调地址',
  58 + field: 'notifyUrl',
  59 + isSearch: true
  60 + },
  61 + {
  62 + title: '回调状态',
  63 + field: 'notifyStatus',
  64 + dictType: DICT_TYPE.PAY_ORDER_NOTIFY_STATUS,
  65 + dictClass: 'number',
  66 + isSearch: true
  67 + },
  68 + {
  69 + title: '退款类型',
  70 + field: 'type',
  71 + dictType: DICT_TYPE.PAY_REFUND_ORDER_TYPE,
  72 + dictClass: 'number',
  73 + isSearch: true
  74 + },
  75 + {
  76 + title: t('common.status'),
  77 + field: 'status',
  78 + dictType: DICT_TYPE.PAY_REFUND_ORDER_STATUS,
  79 + dictClass: 'number',
  80 + isSearch: true
  81 + },
  82 + {
  83 + title: '支付金额',
  84 + field: 'payAmount',
  85 + formatter: 'formatAmount',
  86 + isSearch: true
  87 + },
  88 + {
  89 + title: '退款金额',
  90 + field: 'refundAmount',
  91 + formatter: 'formatAmount',
  92 + isSearch: true
  93 + },
  94 + {
  95 + title: '退款原因',
  96 + field: 'reason',
  97 + isSearch: true
  98 + },
  99 + {
  100 + title: '用户IP',
  101 + field: 'userIp',
  102 + isSearch: true
  103 + },
  104 + {
  105 + title: '渠道订单号',
  106 + field: 'channelOrderNo',
  107 + isSearch: true
  108 + },
  109 + {
  110 + title: '渠道退款单号',
  111 + field: 'channelRefundNo',
  112 + isSearch: true
  113 + },
  114 + {
  115 + title: '渠道调用报错时',
  116 + field: 'channelErrorCode'
  117 + },
  118 + {
  119 + title: '渠道调用报错时',
  120 + field: 'channelErrorMsg'
  121 + },
  122 + {
  123 + title: '支付渠道的额外参数',
  124 + field: 'channelExtras'
  125 + },
  126 + {
  127 + title: '退款失效时间',
  128 + field: 'expireTime',
  129 + formatter: 'formatDate',
  130 + isForm: false,
  131 + search: {
  132 + show: true,
  133 + itemRender: {
  134 + name: 'XDataTimePicker'
  135 + }
  136 + }
  137 + },
  138 + {
  139 + title: '退款成功时间',
  140 + field: 'successTime',
  141 + formatter: 'formatDate',
  142 + isForm: false,
  143 + search: {
  144 + show: true,
  145 + itemRender: {
  146 + name: 'XDataTimePicker'
  147 + }
  148 + }
  149 + },
  150 + {
  151 + title: '退款通知时间',
  152 + field: 'notifyTime',
  153 + formatter: 'formatDate',
  154 + isForm: false,
  155 + search: {
  156 + show: true,
  157 + itemRender: {
  158 + name: 'XDataTimePicker'
  159 + }
  160 + }
  161 + },
  162 + {
  163 + title: t('common.createTime'),
  164 + field: 'createTime',
  165 + formatter: 'formatDate',
  166 + isForm: false,
  167 + search: {
  168 + show: true,
  169 + itemRender: {
  170 + name: 'XDataTimePicker'
  171 + }
97 172 }
98 173 }
99   - },
100   - {
101   - label: t('table.action'),
102   - field: 'action',
103   - width: '240px',
104   - form: {
105   - show: false
106   - },
107   - detail: {
108   - show: false
109   - }
110   - }
111   -])
112   -export const { allSchemas } = useCrudSchemas(crudSchemas)
  174 + ]
  175 +})
  176 +export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
... ...