diff --git a/src/components/registerGlobComp.ts b/src/components/registerGlobComp.ts index 72a1df281..df6eca183 100644 --- a/src/components/registerGlobComp.ts +++ b/src/components/registerGlobComp.ts @@ -6,6 +6,7 @@ import { Icon } from './Icon' import { Layout, Input, + Image, Badge, Popover, InputNumber, @@ -48,6 +49,7 @@ export function registerGlobComp(app: App) { app.use(Button) app.use(Link) app.use(Icon) + app.use(Image) app.use(Layout) app.use(InputNumber) app.use(Tag) diff --git a/src/views/modules/develop/query/QuerySqlEdit.vue b/src/views/modules/develop/query/QuerySqlEdit.vue index 485c59c86..febc8986d 100644 --- a/src/views/modules/develop/query/QuerySqlEdit.vue +++ b/src/views/modules/develop/query/QuerySqlEdit.vue @@ -18,7 +18,7 @@ :label-col="labelCol" :wrapper-col="wrapperCol" > - + diff --git a/src/views/modules/develop/report/ProjectInfoEdit.vue b/src/views/modules/develop/report/ProjectInfoEdit.vue index 91c10f670..933fe3918 100644 --- a/src/views/modules/develop/report/ProjectInfoEdit.vue +++ b/src/views/modules/develop/report/ProjectInfoEdit.vue @@ -17,7 +17,7 @@ :label-col="labelCol" :wrapper-col="wrapperCol" > - + diff --git a/src/views/modules/payment/app/MchAppPayConfigEdit.vue b/src/views/modules/payment/app/MchAppPayConfigEdit.vue new file mode 100644 index 000000000..7e51826ff --- /dev/null +++ b/src/views/modules/payment/app/MchAppPayConfigEdit.vue @@ -0,0 +1,44 @@ + + + + diff --git a/src/views/modules/payment/app/MchAppPayConfigList.vue b/src/views/modules/payment/app/MchAppPayConfigList.vue new file mode 100644 index 000000000..710986fd7 --- /dev/null +++ b/src/views/modules/payment/app/MchAppPayConfigList.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/views/modules/payment/app/MchApplication.api.ts b/src/views/modules/payment/app/MchApplication.api.ts index c05c6ec55..a42518756 100644 --- a/src/views/modules/payment/app/MchApplication.api.ts +++ b/src/views/modules/payment/app/MchApplication.api.ts @@ -21,6 +21,16 @@ export function findAll() { }) } +/** + * 关联支付配置列表 + */ +export function findAllConfig(appId) { + return defHttp.get>({ + url: '/mch/app/findAllConfig', + params: { appId }, + }) +} + /** * 获取单条 */ @@ -76,3 +86,21 @@ export interface MchApplication extends BaseEntity { // 备注 remark?: string } + +/** + * 支付通道配置 + */ +export interface MchAppPayConfigResult { + // 支付通道编码 + channelCode: string + // 支付通道名称 + channelName: string + // 状态 + state: string + // 排序 + sortNo: number + // 图片 + img: string + // 关联配置ID + configId: string +} diff --git a/src/views/modules/payment/app/MchApplicationEdit.vue b/src/views/modules/payment/app/MchApplicationEdit.vue index 6f5add847..5219cb99b 100644 --- a/src/views/modules/payment/app/MchApplicationEdit.vue +++ b/src/views/modules/payment/app/MchApplicationEdit.vue @@ -18,7 +18,7 @@ :label-col="labelCol" :wrapper-col="wrapperCol" > - + diff --git a/src/views/modules/payment/app/MchApplicationList.vue b/src/views/modules/payment/app/MchApplicationList.vue index 683b7e652..a430761bc 100644 --- a/src/views/modules/payment/app/MchApplicationList.vue +++ b/src/views/modules/payment/app/MchApplicationList.vue @@ -72,7 +72,7 @@ import { useTabs } from '/@/hooks/web/useTabs' import { useTitle } from '@vueuse/core' import ALink from '/@/components/Link/Link.vue' - import PayConfig from './PayConfig.vue' + import PayConfig from './MchAppPayConfigList.vue' // 使用hooks const { handleTableChange, pageQueryResHandel, pagination, pages, model, loading, superQueryFlag } = useTablePage(queryPage) @@ -169,7 +169,7 @@ } // 支付配置 function config(record) { - payConfig.show(record.appNo) + payConfig.show(record) } // 删除 diff --git a/src/views/modules/payment/app/PayConfig.vue b/src/views/modules/payment/app/PayConfig.vue deleted file mode 100644 index fc38cd3d9..000000000 --- a/src/views/modules/payment/app/PayConfig.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/src/views/modules/payment/channel/config/PayChannelConfig.api.ts b/src/views/modules/payment/channel/config/PayChannelConfig.api.ts index c348cff92..1ee4e60f7 100644 --- a/src/views/modules/payment/channel/config/PayChannelConfig.api.ts +++ b/src/views/modules/payment/channel/config/PayChannelConfig.api.ts @@ -61,6 +61,23 @@ export function del(id) { }) } +/** + * 编码是否被使用 + */ +export const existsByCode = (code: string) => { + return defHttp.get>({ + url: '/channel/existsByCode', + params: { code }, + }) +} +export const existsByCodeNotId = (code: string, id) => { + return defHttp.get>({ + url: '/channel/existsByCodeNotId', + params: { code, id }, + }) +} + + /** * 支付通道配置 */ @@ -69,6 +86,8 @@ export interface PayChannelConfig extends BaseEntity { code?: string // 支付通道名称 name?: string + // 排序 + sortNo?: number // 图片 image?: string } diff --git a/src/views/modules/payment/channel/config/PayChannelConfigEdit.vue b/src/views/modules/payment/channel/config/PayChannelConfigEdit.vue index 4f7b833e4..415c9ae0f 100644 --- a/src/views/modules/payment/channel/config/PayChannelConfigEdit.vue +++ b/src/views/modules/payment/channel/config/PayChannelConfigEdit.vue @@ -18,17 +18,38 @@ :label-col="labelCol" :wrapper-col="wrapperCol" > - + - - + + - - + + + + + + + + 上传图片 + + + +
+ +
+
@@ -45,10 +66,14 @@ import { nextTick, reactive } from 'vue' import { $ref } from 'vue/macros' import useFormEdit from '/@/hooks/bootx/useFormEdit' - import { add, get, update, PayChannelConfig } from './PayChannelConfig.api' + import { add, get, update, existsByCode, existsByCodeNotId, PayChannelConfig } from './PayChannelConfig.api' import { FormInstance, Rule } from 'ant-design-vue/lib/form' import { FormEditType } from '/@/enums/formTypeEnum' import { BasicDrawer } from '/@/components/Drawer' + import { useValidate } from '/@/hooks/bootx/useValidate' + import { useUpload } from '/@/hooks/bootx/useUpload' + import { useMessage } from '/@/hooks/web/useMessage' + import { getFilePreviewUrlPrefix } from '/@/api/common/FileUpload' const { initFormEditType, handleCancel, @@ -63,24 +88,47 @@ showable, formEditType, } = useFormEdit() + const { existsByServer } = useValidate() + const { tokenHeader, uploadAction } = useUpload('/file/upload') + const { createMessage } = useMessage() + // 表单 const formRef = $ref() + let urlPrefix = $ref() let form = $ref({ id: null, code: '', name: '', - image: '', + sortNo: 0, + image: undefined, }) // 校验 - const rules = reactive({} as Record) + const rules = reactive({ + code: [ + { required: true, message: '请输入支付通道编码' }, + { validator: validateCode, trigger: 'blur' }, + ], + name: [{ required: true, message: '请输入支付通道编码' }], + sortNo: [{ required: true, message: '请输入支付通道编码' }], + } as Record) // 事件 const emits = defineEmits(['ok']) // 入口 function init(id, editType: FormEditType) { initFormEditType(editType) + initData() resetForm() getInfo(id, editType) } + + /** + * 初始化数据 + */ + async function initData() { + const result = await getFilePreviewUrlPrefix() + urlPrefix = result.data + } + // 获取信息 function getInfo(id, editType: FormEditType) { if ([FormEditType.Edit, FormEditType.Show].includes(editType)) { @@ -107,6 +155,29 @@ emits('ok') }) } + // 校验编码重复 + async function validateCode() { + const { code, id } = form + return existsByServer(code, id, formEditType, existsByCode, existsByCodeNotId) + } + + /** + * 文件上传 + */ + function handleChange(info) { + // 上传完毕 + if (info.file.status === 'done') { + const res = info.file.response + if (!res.code) { + form.image = res.data.id + createMessage.success(`${info.file.name} 上传成功!`) + } else { + createMessage.error(`${res.msg}`) + } + } else if (info.file.status === 'error') { + createMessage.error('上传失败') + } + } // 重置表单 function resetForm() { diff --git a/src/views/modules/payment/channel/config/PayChannelConfigList.vue b/src/views/modules/payment/channel/config/PayChannelConfigList.vue index dbabe3dc2..cd695ee68 100644 --- a/src/views/modules/payment/channel/config/PayChannelConfigList.vue +++ b/src/views/modules/payment/channel/config/PayChannelConfigList.vue @@ -15,7 +15,11 @@ - + + + @@ -50,31 +54,48 @@ import { del, page } from './PayChannelConfig.api' import useTablePage from '/@/hooks/bootx/useTablePage' import PayChannelConfigEdit from './PayChannelConfigEdit.vue' - import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table' + import { VxeTableInstance, VxeToolbarInstance, VxePager, VxeTable, VxeToolbar } from 'vxe-table' import BQuery from '/@/components/Bootx/Query/BQuery.vue' import { FormEditType } from '/@/enums/formTypeEnum' import { useMessage } from '/@/hooks/web/useMessage' import { QueryField } from '/@/components/Bootx/Query/Query' + import { getFilePreviewUrlPrefix } from '/@/api/common/FileUpload' // 使用hooks const { handleTableChange, pageQueryResHandel, resetQueryParams, pagination, pages, model, loading } = useTablePage(queryPage) const { notification, createMessage, createConfirm } = useMessage() + const fallbackImg = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg==' // 查询条件 - const fields = [] as QueryField[] + const fields = [ + { field: 'code', name: '编码', placeholder: '请输入支付通道编码' }, + { field: 'name', name: '名称', placeholder: '请输入支付通道名称' }, + ] as QueryField[] const xTable = $ref() const xToolbar = $ref() const payChannelConfigEdit = $ref() + let urlPrefix = $ref() + onMounted(() => { vxeBind() + initData() queryPage() }) function vxeBind() { xTable?.connect(xToolbar as VxeToolbarInstance) } + /** + * 初始化数据 + */ + async function initData() { + const result = await getFilePreviewUrlPrefix() + urlPrefix = result.data + } + // 分页查询 function queryPage() { loading.value = true @@ -111,7 +132,7 @@ }) }, }) - } + } diff --git a/src/views/modules/payment/merchant/MerchantInfoEdit.vue b/src/views/modules/payment/merchant/MerchantInfoEdit.vue index 92ffb838c..72e644b63 100644 --- a/src/views/modules/payment/merchant/MerchantInfoEdit.vue +++ b/src/views/modules/payment/merchant/MerchantInfoEdit.vue @@ -18,7 +18,7 @@ :label-col="labelCol" :wrapper-col="wrapperCol" > - +