ref 商户相关配置联调

This commit is contained in:
bootx
2024-07-16 23:25:40 +08:00
parent bcb069b05f
commit 3cf582135b
20 changed files with 276 additions and 51 deletions

View File

@@ -0,0 +1 @@
<svg t="1718074269709" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="18464" width="128" height="128"><path d="M1024.0512 701.0304V196.864A196.9664 196.9664 0 0 0 827.136 0H196.864A196.9664 196.9664 0 0 0 0 196.864v630.272A196.9152 196.9152 0 0 0 196.864 1024h630.272a197.12 197.12 0 0 0 193.8432-162.0992c-52.224-22.6304-278.528-120.32-396.4416-176.64-89.7024 108.6976-183.7056 173.9264-325.3248 173.9264s-236.1856-87.2448-224.8192-194.048c7.4752-70.0416 55.552-184.576 264.2944-164.9664 110.08 10.3424 160.4096 30.8736 250.1632 60.5184 23.1936-42.5984 42.496-89.4464 57.1392-139.264H248.064v-39.424h196.9152V311.1424H204.8V267.776h240.128V165.632s2.1504-15.9744 19.8144-15.9744h98.4576V267.776h256v43.4176h-256V381.952h208.8448a805.9904 805.9904 0 0 1-84.8384 212.6848c60.672 22.016 336.7936 106.3936 336.7936 106.3936zM283.5456 791.6032c-149.6576 0-173.312-94.464-165.376-133.9392 7.8336-39.3216 51.2-90.624 134.4-90.624 95.5904 0 181.248 24.4736 284.0576 74.5472-72.192 94.0032-160.9216 150.016-253.0816 150.016z" fill="#009FE8" p-id="18465"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1718072839738" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7146" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M911.655822 21.344711a91.022222 91.022222 0 0 1 91.022222 91.022222v799.266134a91.022222 91.022222 0 0 1-91.022222 91.022222H112.344178a91.022222 91.022222 0 0 1-91.022222-91.022222V112.366933a91.022222 91.022222 0 0 1 91.022222-91.022222h799.311644zM561.925689 210.807467a303.900444 303.900444 0 0 0-66.446222-3.049245c-31.425422 1.661156-62.850844 6.599111-94.253511 16.543289-54.567822 18.181689-104.152178 46.2848-145.499023 90.9312a276.024889 276.024889 0 0 0-64.466489 110.774045 255.772444 255.772444 0 0 0-9.921422 51.245511v19.842844l0.068267 2.434845c0.2048 1.683911 0.864711 2.525867 3.231289 2.525866 0 9.921422 0 18.204444 1.661155 26.464711 3.299556 19.820089 8.260267 39.662933 14.882134 57.867378 16.520533 41.324089 42.985244 77.687467 76.049066 107.451733l5.9392 5.597867c7.964444 7.054222 15.883378 12.583822 23.825067 19.205689 3.299556 1.661156 3.299556 3.299556 3.299556 6.599111l-5.848178 29.195378a722.488889 722.488889 0 0 0-7.3728 43.576889c-1.661156 3.299556-1.661156 8.260267-1.661156 11.559822 0 4.960711 3.299556 6.599111 6.599111 6.599111 3.322311 0 8.283022-1.6384 11.605334-3.299555 18.158933-9.898667 34.702222-19.820089 52.883911-31.402667l7.850666-4.960711c5.006222-3.299556 9.784889-6.599111 15.291734-9.921422h4.960711c18.204444 6.599111 38.024533 11.582578 57.867378 14.882133 11.582578 1.661156 24.803556 1.661156 38.024533 3.299555h29.764267c16.543289 0 34.724978-1.6384 52.906666-4.960711 26.464711-4.960711 52.906667-13.198222 79.371378-23.1424a329.090844 329.090844 0 0 0 119.034311-82.670933c28.103111-31.402667 47.945956-66.127644 59.528534-105.813333 4.960711-18.181689 8.260267-36.363378 9.921422-54.545067 3.299556-43.008-4.960711-84.332089-23.165156-124.017778a48.082489 48.082489 0 0 0-4.391822-10.831644l-3.868444-7.350045a1.820444 1.820444 0 0 0-0.250312-0.978489l-1.137777-1.342577-0.273067-0.978489c-1.6384 1.2288-3.413333 2.366578-5.211022 3.458844l-11.0592 6.303289-5.233778 3.458845c-100.829867 59.528533-200.021333 119.034311-300.896711 178.562844-18.181689 11.582578-36.363378 23.1424-56.206222 33.063822a33.336889 33.336889 0 0 1-18.181689 4.960711c-9.921422 1.661156-18.204444-3.299556-23.1424-14.882133-16.543289-39.685689-33.063822-77.710222-49.607111-117.373156-3.299556-8.283022-4.960711-16.543289-6.599111-24.803555v-1.661156c0-9.921422 4.937956-13.220978 13.198222-8.260266l16.452266 10.831644c3.413333 2.321067 6.712889 4.7104 10.012445 7.350045 13.220978 8.260267 24.803556 16.543289 38.024533 24.803555 16.543289 9.921422 34.724978 11.559822 52.906667 3.299556 92.615111-41.324089 185.184711-84.309333 277.777067-127.294578 13.198222-4.960711 26.441956-11.582578 39.662933-18.204445a1.820444 1.820444 0 0 0 0.978489-0.227555l1.365333-1.137778 0.978489-0.273067c-4.960711-4.960711-8.283022-9.921422-13.243733-14.882133-38.001778-39.685689-82.648178-67.7888-133.916445-85.970489l-9.102222-3.345066a295.844978 295.844978 0 0 0-53.703111-13.198223z" fill="#15BA12" p-id="7147"></path></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -31,12 +31,10 @@ export interface QueryField {
name?: string
// 精度
precision?: number
// 查询列表
// 下拉列表内容
selectList?: LabeledValue[] | null
// 时间格式化
format?: string | null
// 默认值 未启用
defaultValue?: number | string
}
/**

View File

@@ -0,0 +1,8 @@
/**
* 支付通道
*/
export enum ChannelEnum {
ALI = 'ali_pay',
WECHAT = 'wechat_pay',
UNION_PAY = 'union_pay',
}

View File

@@ -13,7 +13,7 @@
ref="formRef"
:model="form"
:rules="rules"
validate-trigger="['blur', 'change']"
:validate-trigger="['blur', 'change']"
:label-col="labelCol"
:wrapper-col="wrapperCol"
>

View File

@@ -13,7 +13,7 @@
ref="formRef"
:model="form"
:rules="rules"
validate-trigger="['blur', 'change']"
:validate-trigger="['blur', 'change']"
:label-col="labelCol"
:wrapper-col="wrapperCol"
>

View File

@@ -13,7 +13,7 @@
ref="formRef"
:model="form"
:rules="rules"
validate-trigger="['blur', 'change']"
:validate-trigger="['blur', 'change']"
:label-col="labelCol"
:wrapper-col="wrapperCol"
>

View File

@@ -25,7 +25,7 @@ export const get = (id) => {
*/
export const add = (obj) => {
return defHttp.post<Result<void>>({
url: '/mch/app/save',
url: '/mch/app/add',
data: obj,
})
}
@@ -60,17 +60,17 @@ export interface MchApp extends BaseEntity {
// 应用名称
appName?: string
// 签名方式
signType?: string
signType: string
// 签名秘钥
signSecret?: string
// 是否对请求进行验签
reqSign?: boolean
reqSign: boolean
// 支付限额
limitAmount?: number
limitAmount: number
// 订单默认超时时间(分钟)
orderTimeout: number
// 异步消息通知类型
notifyType?: string
notifyType: string
// 通知地址, http/WebSocket 需要配置
notifyUrl?: string
// 状态

View File

@@ -12,7 +12,7 @@
class="small-from-item"
:model="form"
ref="formRef"
validate-trigger="['blur', 'change']"
:validate-trigger="['blur', 'change']"
:rules="rules"
:label-col="labelCol"
:wrapper-col="wrapperCol"
@@ -20,11 +20,16 @@
<a-form-item label="主键" name="id" :hidden="true">
<a-input v-model:value="form.id" :disabled="showable" />
</a-form-item>
<a-form-item label="商户号" name="mchNo" v-show="!addable">
{{ form.mchNo }}
<a-form-item label="商户号" name="mchNo">
<a-select
v-model:value="form.mchNo"
:disabled="showable"
placeholder="请选择商户"
:options="mchNoOptions"
/>
</a-form-item>
<a-form-item label="应用号" name="appId" v-if="!addable">
{{ form.appId }}
<a-tag> {{ form.appId }}</a-tag>
</a-form-item>
<a-form-item label="应用名称" name="appName">
<a-input v-model:value="form.appName" :disabled="showable" placeholder="请输入应用名称" />
@@ -64,14 +69,15 @@
<a-textarea v-model:value="form.signSecret" :disabled="showable" placeholder="请输入公钥" />
<a-button type="link" @click="genSignSecret">生成秘钥</a-button>
</a-form-item>
<a-form-item label="通知方式" name="noticeType">
<a-radio-group v-model:value="form.signType" button-style="solid">
<a-form-item label="通知方式" name="notifyType">
<a-radio-group v-model:value="form.notifyType" button-style="solid">
<a-radio-button value="none">不启用</a-radio-button>
<a-radio-button value="http">http</a-radio-button>
<a-radio-button value="websocket">websocket</a-radio-button>
<a-radio-button disabled value="mq">消息队列</a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item label="通知地址" name="notifyUrl">
<a-form-item label="通知地址" name="notifyUrl" v-if="form.notifyType !== 'none'">
<a-input v-model:value="form.notifyUrl" :disabled="showable" placeholder="请输入通知地址" />
</a-form-item>
</a-form>
@@ -98,7 +104,9 @@
import { FormInstance, Rule } from 'ant-design-vue/lib/form'
import { FormEditType } from '@/enums/formTypeEnum'
import { BasicDrawer } from '@/components/Drawer'
import { buildUUID } from "@/utils/uuid";
import { buildUUID } from '@/utils/uuid'
import { dropdown as merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
const {
initFormEditType,
@@ -115,27 +123,48 @@
// 表单
const formRef = ref<FormInstance>()
let form = ref<MchApp>({})
const form = ref<MchApp>({
notifyType: 'none',
signType: 'HMAC_SHA256',
limitAmount: 200.0,
orderTimeout: 5,
reqSign: true,
})
const mchNoOptions = ref<LabeledValue[]>([])
// 校验
const rules = reactive({
mchNo: [{ required: true, message: '请选择所属商户' }],
appName: [{ required: true, message: '请输入应用名称' }],
signType: [{ required: true, message: '请选择签名方式' }],
signSecret: [{ required: true, message: '请输入签名秘钥' }],
reqSign: [{ required: true, message: '请选择是否验签' }],
limitAmount: [{ required: true, message: '请选择是否验签' }],
orderTimeout: [{ required: true, message: '请选择是否验签' }],
notifyType: [{ required: true, message: '请选择是否验签' }],
limitAmount: [{ required: true, message: '请输入支付限额(元)' }],
orderTimeout: [{ required: true, message: '请输入订单默认超时时间(分钟)' }],
notifyType: [{ required: true, message: '请选择消息通知方式' }],
} as Record<string, Rule[]>)
// 事件
const emits = defineEmits(['ok'])
// 入口
/**
* 入口
*/
function init(id, editType: FormEditType) {
initMerchant()
initFormEditType(editType)
resetForm()
getInfo(id, editType)
}
/**
* 初始化商户列表信息
*/
function initMerchant() {
merchantDropdown().then(({ data }) => {
mchNoOptions.value = data
})
}
/**
* 获取信息
*/
@@ -169,7 +198,7 @@
* 生成秘钥
*/
function genSignSecret() {
form.value.signSecret = buildUUID()+buildUUID()
form.value.signSecret = buildUUID() + buildUUID()
}
/**
* 重置表单的校验

View File

@@ -4,6 +4,7 @@
<b-query
:query-params="model.queryParam"
:fields="fields"
:default-item-count="3"
@query="queryPage"
@reset="resetQueryParams"
/>
@@ -39,15 +40,13 @@
</template>
</vxe-column>
<vxe-column field="createTime" title="创建时间" :min-width="120" />
<vxe-column fixed="right" width="150" :showOverflow="false" title="操作">
<vxe-column fixed="right" :width="220" :showOverflow="false" title="操作">
<template #default="{ row }">
<span>
<a-link @click="show(row)">查看</a-link>
</span>
<a-link @click="show(row)">查看</a-link>
<a-divider type="vertical" />
<span>
<a-link @click="edit(row)">编辑</a-link>
</span>
<a-link @click="edit(row)">编辑</a-link>
<a-divider type="vertical" />
<a-link @click="showChannelSetup(row)">通道配置</a-link>
<a-divider type="vertical" />
<a-link danger @click="remove(row)">删除</a-link>
</template>
@@ -62,22 +61,26 @@
@page-change="handleTableChange"
/>
<MchAppEdit ref="mchApp" @ok="queryPage" />
<ChannelSetup ref="channelSetup" />
</div>
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref } from 'vue'
import { computed, onMounted, ref } from 'vue'
import { del, page } from './MchApp.api'
import useTablePage from '@/hooks/bootx/useTablePage'
import MchAppEdit from './MchAppEdit.vue'
import BQuery from '@/components/Bootx/Query/BQuery.vue'
import { STRING } from '@/components/Bootx/Query/Query'
import { LIST, QueryField, STRING } from '@/components/Bootx/Query/Query'
import { FormEditType } from '@/enums/formTypeEnum'
import { useMessage } from '@/hooks/web/useMessage'
import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import ALink from '@/components/Link/Link.vue'
import { useDict } from '@/hooks/bootx/useDict'
import { dropdown as merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import ChannelSetup from '@/views/daxpay/admin/merchant/channel/ChannelSetup.vue'
// 使用hooks
const {
@@ -92,19 +95,40 @@
const { createMessage, createConfirm } = useMessage()
const { dictConvert } = useDict()
// 查询条件
const fields = [
{ field: 'code', formType: STRING, name: '编码', placeholder: '请输入终端编码' },
{ field: 'name', formType: STRING, name: '名称', placeholder: '请输入终端名称' },
]
const fields = computed(() => {
return [
{
field: 'mchNo',
type: LIST,
name: '商户',
selectList: mchNoOptions.value,
placeholder: '请选择商户',
},
{ field: 'appId', type: STRING, name: '商户号', placeholder: '请输入应用号' },
{ field: 'appName', type: STRING, name: '应用名称', placeholder: '请输入应用名称' },
] as QueryField[]
})
const xTable = ref<VxeTableInstance>()
const xToolbar = ref<VxeToolbarInstance>()
const mchApp: any = ref()
const channelSetup: any = ref()
const mchNoOptions = ref<LabeledValue[]>([])
onMounted(() => {
vxeBind()
initMerchant()
queryPage()
})
/**
* 初始化商户列表信息
*/
function initMerchant() {
merchantDropdown().then(({ data }) => {
mchNoOptions.value = data
})
}
function vxeBind() {
xTable.value?.connect(xToolbar.value as VxeToolbarInstance)
}
@@ -133,6 +157,13 @@
mchApp.value.init(record.id, FormEditType.Show)
}
/**
* channelSetup
*/
function showChannelSetup(record) {
channelSetup.value.init(record.appId)
}
// 删除
function remove(record) {
createConfirm({

View File

@@ -0,0 +1,31 @@
import { defHttp } from '@/utils/http/axios'
import { Result } from '#/axios'
import { BaseEntity } from '#/web'
/**
* 列表
*/
export function findAll(appId) {
return defHttp.get<Result<ChannelConfig[]>>({
url: '/channel/config/findAllByAppId',
params: {
appId,
},
})
}
/**
* 支付通道配着
*/
export interface ChannelConfig extends BaseEntity {
// 通道编码
channel?: string
// 通道名称
name?: string
// 是否启用
enable?: boolean
// 通道商户号
outMchNo?: string
// 通道APPID
outAppId?: string
}

View File

@@ -0,0 +1,115 @@
<template>
<basic-drawer
showFooter
v-bind="$attrs"
width="70%"
title="通道配置"
:mask-closable="true"
:open="visible"
@close="handleCancel"
>
<div class="m-3 p-3 bg-white">
<a-spin :spinning="confirmLoading">
<a-list
style="margin-left: 20px"
:grid="{ gutter: 16, xs: 1, sm: 2, md: 3, lg: 4, xl: 5, xxl: 6 }"
:data-source="channelConfigs"
>
<template #renderItem="{ item }">
<a-card hoverable style="max-width: 200px; margin-bottom: 20px" @click="setting(item)">
<template #cover>
<a-image
style="width: 150px; height: 150px; margin-top: 20px"
:preview="false"
:src="getIcon(item.channel)"
:fallback="fallbackImg"
/>
</template>
<a-card-meta
style="display: flex; justify-content: space-between"
:title="item.name"
/>
</a-card>
</template>
</a-list>
</a-spin>
</div>
</basic-drawer>
</template>
<script setup lang="ts">
import { BasicDrawer } from '@/components/Drawer'
import { ref } from 'vue'
import { findAll, ChannelConfig } from './ChannelConfig.api'
import { ChannelEnum } from '@/enums/daxpay/ChannelEnum'
import alipay from '@/assets/daxpay/alipay.svg'
import wechat from '@/assets/daxpay/wechat.svg'
import unionPay from '@/assets/daxpay/unionPay.svg'
const confirmLoading = ref(false)
const channelConfigs = ref<ChannelConfig[]>([])
const channelPayConfigEdit = ref<any>()
const visible = ref(false)
// 默认图片的base64值
const fallbackImg =
'data:image/png;base64,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'
/**
* 初始化并展示
*/
async function init(appId: string) {
visible.value = true
confirmLoading.value = true
// 列表信息
findAll(appId).then(({ data }) => {
channelConfigs.value = data
confirmLoading.value = false
})
}
/**
* 打开支付设置界面
*/
function setting(record: ChannelConfig) {
channelPayConfigEdit.value.show(record)
}
/**
* 关闭页面
*/
function handleCancel() {
visible.value = false
}
/**
* 获取icon
*/
function getIcon(type: string) {
switch (type) {
case ChannelEnum.ALI:
return alipay
case ChannelEnum.WECHAT:
return wechat
case ChannelEnum.UNION_PAY:
return unionPay
default:
return ''
}
}
defineExpose({ init })
</script>
<style scoped lang="less">
:deep(.ant-card-meta-title) {
display: flex;
justify-content: center;
}
:deep(.ant-image) {
display: flex;
justify-content: center;
align-items: center;
}
</style>

View File

@@ -1,6 +1,7 @@
import { defHttp } from '@/utils/http/axios'
import { PageResult, Result } from '#/axios'
import { BaseEntity } from '#/web'
import { LabeledValue } from 'ant-design-vue/lib/select'
/**
* 分页
@@ -25,7 +26,7 @@ export const get = (id) => {
*/
export const add = (obj) => {
return defHttp.post<Result<void>>({
url: '/merchant/save',
url: '/merchant/add',
data: obj,
})
}
@@ -39,6 +40,15 @@ export const update = (obj) => {
})
}
/**
* 商户下拉列表
*/
export const dropdown = () => {
return defHttp.get<Result<LabeledValue[]>>({
url: '/merchant/dropdown',
})
}
/**
* 删除
*/

View File

@@ -12,7 +12,7 @@
class="small-from-item"
:model="form"
ref="formRef"
validate-trigger="['blur', 'change']"
:validate-trigger="['blur', 'change']"
:rules="rules"
:label-col="labelCol"
:wrapper-col="wrapperCol"

View File

@@ -65,7 +65,7 @@
import useTablePage from '@/hooks/bootx/useTablePage'
import MerchantEdit from './MerchantEdit.vue'
import BQuery from '@/components/Bootx/Query/BQuery.vue'
import { STRING } from '@/components/Bootx/Query/Query'
import {QueryField, STRING} from '@/components/Bootx/Query/Query'
import { FormEditType } from '@/enums/formTypeEnum'
import { useMessage } from '@/hooks/web/useMessage'
import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
@@ -86,9 +86,9 @@
const { dictConvert } = useDict()
// 查询条件
const fields = [
{ field: 'code', formType: STRING, name: '编码', placeholder: '请输入终端编码' },
{ field: 'name', formType: STRING, name: '名称', placeholder: '请输入终端名称' },
]
{ field: 'mchName', type: STRING, name: '商户名称', placeholder: '请输入商户名称' },
{ field: 'companyName', type: STRING, name: '公司名称', placeholder: '请输入公司名称' },
] as QueryField[]
const xTable = ref<VxeTableInstance>()
const xToolbar = ref<VxeToolbarInstance>()
const merchantEdit: any = ref()

View File

@@ -72,7 +72,7 @@
import useTablePage from '@/hooks/bootx/useTablePage'
import ClientEdit from './ClientEdit.vue'
import BQuery from '@/components/Bootx/Query/BQuery.vue'
import { STRING } from '@/components/Bootx/Query/Query'
import {QueryField, STRING} from '@/components/Bootx/Query/Query'
import { FormEditType } from '@/enums/formTypeEnum'
import { useMessage } from '@/hooks/web/useMessage'
import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
@@ -92,9 +92,9 @@
// 查询条件
const fields = [
{ field: 'code', formType: STRING, name: '编码', placeholder: '请输入终端编码' },
{ field: 'name', formType: STRING, name: '名称', placeholder: '请输入终端名称' },
]
{ field: 'code', type: STRING, name: '编码', placeholder: '请输入终端编码' },
{ field: 'name', type: STRING, name: '名称', placeholder: '请输入终端名称' },
] as QueryField[]
const xTable = ref<VxeTableInstance>()
const xToolbar = ref<VxeToolbarInstance>()
const clientEdit: any = ref()

View File

@@ -12,7 +12,7 @@
class="small-from-item"
ref="formRef"
:model="form"
validate-trigger="['blur', 'change']"
:validate-trigger="['blur', 'change']"
:rules="rules"
:label-col="labelCol"
:wrapper-col="wrapperCol"

View File

@@ -13,7 +13,7 @@
ref="formRef"
class="small-from-item"
:model="form"
validate-trigger="['blur', 'change']"
:validate-trigger="['blur', 'change']"
:rules="rules"
:labelCol="labelCol"
:wrapperCol="wrapperCol"

View File

@@ -12,7 +12,7 @@
class="small-from-item"
:model="form"
ref="formRef"
validate-trigger="['blur', 'change']"
:validate-trigger="['blur', 'change']"
:rules="rules"
:label-col="labelCol"
:wrapper-col="wrapperCol"