feat 进件商户选择

This commit is contained in:
bootx
2025-11-11 23:09:49 +08:00
parent c9752a2ca5
commit 8b8c9953bc
21 changed files with 792 additions and 84 deletions

View File

@@ -23,7 +23,11 @@
<a-input v-model:value="form.id" />
</a-form-item>
<a-form-item label="汇付应用号" name="adaPayAppId">
<a-input v-model:value="form.adaPayAppId" placeholder="请输入汇付AppId" />
<a-select v-model:value="form.adaPayAppId" placeholder="请选择汇付应用号" allow-clear>
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="是否启用" name="enable">
<a-switch
@@ -104,6 +108,8 @@
import { useMessage } from '@/hooks/web/useMessage'
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -117,15 +123,15 @@
sandbox: false,
})
let rawForm: any = {}
const onbMchNoList = ref<LabeledValue[]>([])
// 校验
const rules = computed(() => {
return {
adaPayAppId: [{ required: true, message: '请输入汇付AppId' }],
adaPayAppId: [{ required: true, message: '请选择汇付应用号' }],
enable: [{ required: true, message: '请选择是否启用' }],
sandbox: [{ required: true, message: '请选择是否为沙箱环境' }],
apiKey: [{ required: true, message: '请输入汇付交易密钥' }],
mchPrivateKey: [{ required: true, message: '请输入汇付商户RSA私钥' }],
// adaPayPublicKey: [{ required: true, message: '请输入汇平台RSA公钥' }],
} as Record<string, Rule[]>
})
// 事件
@@ -135,11 +141,21 @@
*/
function init(config: ChannelConfig) {
channelConfig.value = config
initData()
resetForm()
visible.value = true
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -42,7 +42,6 @@ export function updateSub(obj: AlipaySubConfig) {
})
}
/**
* 支付宝配置
*/
@@ -80,12 +79,12 @@ export interface AlipayConfig extends MchEntity {
}
/**
* 子商户服务商配置
* 支付宝子商户配置
*/
export interface AlipaySubConfig extends MchEntity {
// 服务商号
isvNo?: string
// 应用授权Token
// 应用授权令牌
appAuthToken?: string
// 是否启用
enable: boolean

View File

@@ -22,7 +22,15 @@
<a-input v-model:value="form.id" />
</a-form-item>
<a-form-item label="AppId" name="aliAppId">
<a-input v-model:value="form.aliAppId" placeholder="请输入支付宝商户AppId" />
<a-select
v-model:value="form.aliAppId"
placeholder="请选择支付宝商户AppId"
style="width: 100%"
>
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="是否启用" name="enable">
<a-switch
@@ -185,6 +193,8 @@
import { BasicDrawer } from '@/components/Drawer'
import { Icon } from '@/components/Icon'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -194,6 +204,7 @@
const formRef = ref<FormInstance>()
const channelConfig = ref<ChannelConfig>({})
const isIsv = ref<boolean>(false)
const onbMchNoList = ref<LabeledValue[]>([])
const form = ref<AlipayConfig>({
aliAppId: '',
@@ -211,7 +222,7 @@
// 校验
const rules = computed(() => {
return {
aliAppId: [{ required: true, message: '请输入AppId' }],
aliAppId: [{ required: true, message: '请选择支付宝商户AppId' }],
enable: [{ required: true, message: '请选择是否启用' }],
authType: [{ required: true, message: '请选择认证方式' }],
appAuthToken: [{ required: isIsv.value, message: '请输入特约商户AppAuthToken' }],
@@ -236,18 +247,28 @@
isIsv.value = isv
resetForm()
visible.value = true
initData()
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/
function getInfo() {
getConfig(channelConfig.value.appId).then(({ data }) => {
confirmLoading.value = true
rawForm = { ...data }
form.value = data
confirmLoading.value = false
})
getConfig(channelConfig.value.appId).then(({ data }) => {
confirmLoading.value = true
rawForm = { ...data }
form.value = data
confirmLoading.value = false
})
}
/**
* 更新

View File

@@ -21,6 +21,13 @@
<a-form-item label="主键" name="id" :hidden="true">
<a-input v-model:value="form.id" />
</a-form-item>
<a-form-item label="是否启用" name="enable">
<a-switch
checked-children="启用"
un-checked-children="停用"
v-model:checked="form.enable"
/>
</a-form-item>
<a-form-item
name="appAuthToken"
label="应用授权Token"
@@ -31,12 +38,20 @@
placeholder="请输入支付宝商户应用授权Token(app_auth_token)"
/>
</a-form-item>
<a-form-item label="是否启用" name="enable">
<a-switch
checked-children="启用"
un-checked-children="停用"
v-model:checked="form.enable"
/>
<a-form-item
label="应用授权令牌"
name="appAuthToken"
:rules="[{ required: true, message: '请选择支付宝应用授权令牌' }]"
>
<a-select
v-model:value="form.appAuthToken"
:disabled="showable"
placeholder="请选择支付宝应用授权令牌"
>
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item
name="alipayUserId"
@@ -71,6 +86,8 @@
import { useMessage } from '@/hooks/web/useMessage'
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -78,6 +95,7 @@
const formRef = ref<FormInstance>()
const channelConfig = ref<ChannelConfig>({})
const onbMchNoList = ref<LabeledValue[]>([])
const form = ref({
enable: true,
@@ -86,7 +104,7 @@
// 校验
const rules = computed(() => {
return {
appAuthToken: [{ required: true, message: '应用授权Token不可为空' }],
appAuthToken: [{ required: true, message: '应用授权令牌不可为空' }],
enable: [{ required: true, message: '请选择是否启用' }],
} as Record<string, Rule[]>
})
@@ -99,9 +117,19 @@
channelConfig.value = config
resetForm()
visible.value = true
initData()
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -30,7 +30,11 @@
/>
</a-form-item>
<a-form-item label="商户号" name="merchantNo">
<a-input v-model:value="form.merchantNo" placeholder="请输入商户" />
<a-select v-model:value="form.merchantNo" placeholder="请选择斗拱进件商户" allow-clear>
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-divider>微信认证配置</a-divider>
<a-form-item label="读取服务商配置" name="readSystem">
@@ -94,6 +98,8 @@
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { YeePaySubConfig } from '@/views/daxpay/common/channel/yeepay/config/payment/YeePayConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -102,7 +108,7 @@
const formRef = ref<FormInstance>()
const channelConfig = ref<ChannelConfig>({})
const form = ref<YeePaySubConfig>({})
const onbMchNoList = ref<LabeledValue[]>([])
let rawForm: any = {}
// 校验
@@ -121,11 +127,21 @@
*/
function init(config: ChannelConfig) {
channelConfig.value = config
initData()
resetForm()
visible.value = true
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -30,7 +30,11 @@
/>
</a-form-item>
<a-form-item label="商户号" name="merchantNo">
<a-input v-model:value="form.merchantNo" placeholder="请输入富友支付商户" />
<a-select v-model:value="form.merchantNo" placeholder="请选择富友进件商户">
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="终端号" name="termNo" tooltip="没有真实终端号统一填88888888">
<a-input v-model:value="form.termNo" placeholder="请输入富友支付终端号" />
@@ -56,10 +60,7 @@
v-model:checked="form.wxChannelAuth"
/>
</a-form-item>
<a-form-item
label="微信AppId"
name="wxAppId"
>
<a-form-item label="微信AppId" name="wxAppId">
<a-input
v-model:value="form.wxAppId"
:disabled="showable"
@@ -115,6 +116,8 @@
import { useMessage } from '@/hooks/web/useMessage'
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -124,6 +127,7 @@
const channelConfig = ref<ChannelConfig>({
enable: true,
})
const onbMchNoList = ref<LabeledValue[]>([])
const form = ref<FouyouSubConfig>({
enable: true,
termNo: '8888888',
@@ -148,9 +152,19 @@
channelConfig.value = config
resetForm()
visible.value = true
initData()
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -31,7 +31,7 @@
</a-form-item>
<a-form-item label="海科商户号" name="merchNo">
<a-select v-model:value="form.merchNo" placeholder="请选择海科进件商户" allow-clear>
<a-select-option v-for="item in onbMchNoList" :key="item.value">
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
@@ -60,10 +60,7 @@
v-model:checked="form.wxChannelAuth"
/>
</a-form-item>
<a-form-item
label="微信AppId"
name="wxAppId"
>
<a-form-item label="微信AppId" name="wxAppId">
<a-input
v-model:value="form.wxAppId"
:disabled="showable"
@@ -120,7 +117,7 @@
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { ChannelEnum } from '@/enums/daxpay/daxpayEnum'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -163,6 +160,9 @@
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**

View File

@@ -30,7 +30,11 @@
/>
</a-form-item>
<a-form-item label="商户号" name="merchantNo">
<a-input v-model:value="form.merchantNo" placeholder="请输入拉卡拉商户" />
<a-select v-model:value="form.merchantNo" placeholder="请选择拉卡拉进件商户">
<a-select-option v-for="item in onbMchNoList" :key="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="终端号" name="termNo">
<a-input v-model:value="form.termNo" placeholder="请输入拉卡拉终端号" />
@@ -105,6 +109,8 @@
import { useMessage } from '@/hooks/web/useMessage'
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -114,6 +120,7 @@
const channelConfig = ref<ChannelConfig>({
enable: true,
})
const onbMchNoList = ref<LabeledValue[]>([])
const form = ref<LakalaSubConfig>({
enable: true,
readSystem: true,
@@ -122,6 +129,7 @@
// 校验
const rules = computed(() => {
return {
onbMchNo: [{ required: true, message: '请选择拉卡拉进件商户' }],
enable: [{ required: true, message: '请选择是否启用' }],
merchantNo: [{ required: true, message: '请输入商户编号' }],
termNo: [{ required: true, message: '请输入终端号' }],
@@ -136,9 +144,19 @@
channelConfig.value = config
resetForm()
visible.value = true
initData()
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -23,7 +23,7 @@ export function update(obj: LeshuaSubConfig) {
}
/**
* 子商户服务商配置
* 乐刷支付子商户配置
*/
export interface LeshuaSubConfig extends MchEntity {
// 服务商号

View File

@@ -38,7 +38,7 @@
:rules="[{ required: true, message: '请选择乐刷进件商户' }]"
>
<a-select v-model:value="form.lsMchNo" placeholder="请选择乐刷进件商户" allow-clear>
<a-select-option v-for="item in onbMchNoList" :key="item.value">
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
@@ -114,6 +114,7 @@
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -144,6 +145,14 @@
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息

View File

@@ -31,6 +31,11 @@
</a-form-item>
<a-form-item label="商户号" name="merchantNo">
<a-input v-model:value="form.merchantNo" placeholder="请输入杉德支付商户号" />
<a-select v-model:value="form.merchantNo" placeholder="请选择杉德进件商户">
<a-select-option v-for="item in onbMchNoList" :key="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="门店号" name="storeId" tooltip="通常默认为100001">
<a-input v-model:value="form.storeId" placeholder="请输入杉德支付门店号" />
@@ -56,10 +61,7 @@
v-model:checked="form.wxChannelAuth"
/>
</a-form-item>
<a-form-item
label="微信AppId"
name="wxAppId"
>
<a-form-item label="微信AppId" name="wxAppId">
<a-input
v-model:value="form.wxAppId"
:disabled="showable"
@@ -115,6 +117,8 @@
import { useMessage } from '@/hooks/web/useMessage'
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -124,6 +128,7 @@
const channelConfig = ref<ChannelConfig>({
enable: true,
})
const onbMchNoList = ref<LabeledValue[]>([])
const form = ref<SandSubConfig>({
enable: true,
storeId: '100001',
@@ -134,6 +139,7 @@
// 校验
const rules = computed(() => {
return {
onbMchNo: [{ required: true, message: '请选择杉德进件商户' }],
enable: [{ required: true, message: '请选择是否启用' }],
merchantNo: [{ required: true, message: '请输入商户编号' }],
storeId: [{ required: true, message: '请输入门店号' }],
@@ -148,9 +154,19 @@
channelConfig.value = config
resetForm()
visible.value = true
initData()
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -30,7 +30,15 @@
/>
</a-form-item>
<a-form-item label="商户号" name="mno">
<a-input v-model:value="form.mno" placeholder="请输入随行付商户号" />
<a-select
v-model:value="form.mno"
:disabled="showable"
placeholder="请选择随行付进件商户"
>
<a-select-option v-for="item in onbMchNoList" :key="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-divider>微信认证配置</a-divider>
<a-form-item
@@ -102,6 +110,8 @@
import { useMessage } from '@/hooks/web/useMessage'
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -109,6 +119,7 @@
const formRef = ref<FormInstance>()
const channelConfig = ref<ChannelConfig>({})
const onbMchNoList = ref<LabeledValue[]>([])
const form = ref({
enable: true,
@@ -118,6 +129,7 @@
// 校验
const rules = computed(() => {
return {
onbMchNo: [{ required: true, message: '请选择随行付进件商户' }],
enable: [{ required: true, message: '请选择是否启用' }],
mno: [{ required: true, message: '请输入随行付商户号' }],
} as Record<string, Rule[]>
@@ -131,9 +143,19 @@
channelConfig.value = config
resetForm()
visible.value = true
initData()
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -22,7 +22,11 @@
<a-input v-model:value="form.id" :disabled="showable" />
</a-form-item>
<a-form-item label="商户号" name="wxMchId">
<a-input v-model:value="form.wxMchId" :disabled="showable" placeholder="请输入商户号" />
<a-select v-model:value="form.wxMchId" :disabled="showable" placeholder="请选择商户号">
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ item.label }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="应用号(AppId)" name="wxAppId">
<a-input
@@ -31,26 +35,6 @@
placeholder="请输入微信应用AppId"
/>
</a-form-item>
<a-form-item label="子商户号" name="subMchId" v-if="isIsv">
<a-input
v-model:value="form.subMchId"
:disabled="showable"
placeholder="请输入子商户号"
/>
</a-form-item>
<a-form-item label="子应用号(subAppId)" name="subAppId" v-if="isIsv">
<a-input
v-model:value="form.subAppId"
:disabled="showable"
placeholder="请输入微信子应用AppId"
/>
</a-form-item>
<a-form-item label="OpenId获取方式" name="authType" v-if="isIsv">
<a-radio-group v-model:value="form.authType" button-style="solid">
<a-radio-button value="sp"> 服务商用户标识 </a-radio-button>
<a-radio-button value="sub"> 子商户应用用户标识 </a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item label="公众号AppSecret" name="appSecret">
<a-input
v-model:value="form.appSecret"
@@ -251,6 +235,8 @@
import Icon from '@/components/Icon/Icon.vue'
import { useMessage } from '@/hooks/web/useMessage'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -269,11 +255,12 @@
})
const channelConfig = ref<ChannelConfig>({})
const onbMchNoList = ref<LabeledValue[]>([])
// 校验
const rules = computed(() => {
return {
wxMchId: [{ required: true, message: '请输入商户号' }],
wxMchId: [{ required: true, message: '请选择商户号' }],
wxAppId: [{ required: true, message: '请输入应用编号' }],
subMchId: [{ required: isIsv.value, message: '请输入子商户号' }],
enable: [{ required: true, message: '请选择是否启用' }],
@@ -308,8 +295,17 @@
isIsv.value = isv
visible.value = true
resetForm()
initData()
getInfo()
}
/**
* 初始化进件商户号列表
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -29,12 +29,20 @@
v-model:checked="form.enable"
/>
</a-form-item>
<a-form-item label="微信子商户号" name="subMchId">
<a-input
<a-form-item
label="微信子商户号"
name="subMchId"
:rules="[{ required: true, message: '请选择微信子商户号' }]"
>
<a-select
v-model:value="form.subMchId"
:disabled="showable"
placeholder="请输入微信子商户号"
/>
placeholder="请选择微信子商户号"
>
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-divider>授权认证配置</a-divider>
<a-form-item label="OpenId获取方式" name="authType">
@@ -99,11 +107,13 @@
<script lang="ts" setup>
import { computed, nextTick, ref } from 'vue'
import useFormEdit from '@/hooks/bootx/useFormEdit'
import {getSubConfig, updateSub, WechatPaySubConfig} from './WechatPayConfig.api'
import { getSubConfig, updateSub, WechatPaySubConfig } from './WechatPayConfig.api'
import { FormInstance, Rule } from 'ant-design-vue/lib/form'
import { BasicDrawer } from '@/components/Drawer'
import { useMessage } from '@/hooks/web/useMessage'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, labelCol, wrapperCol, confirmLoading, visible, showable } = useFormEdit()
// 文件上传
@@ -117,11 +127,12 @@
})
const channelConfig = ref<ChannelConfig>({})
const onbMchNoList = ref<LabeledValue[]>([])
// 校验
const rules = computed(() => {
return {
subMchId: [{ required: true, message: '请输入子商户商户号' }],
subMchId: [{ required: true, message: '请选择微信子商户号' }],
enable: [{ required: true, message: '请选择是否启用' }],
authType: [{ required: true, message: '请选择OpenId获取方式' }],
} as Record<string, Rule[]>
@@ -134,11 +145,21 @@
*/
function init(config: ChannelConfig) {
channelConfig.value = config
visible.value = true
initData()
resetForm()
visible.value = true
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -23,7 +23,7 @@ export function update(obj: YeePaySubConfig) {
}
/**
* 易宝子商户配置
* 易宝支付子商户配置
*/
export interface YeePaySubConfig extends MchEntity {
// 易宝商户号

View File

@@ -30,7 +30,15 @@
/>
</a-form-item>
<a-form-item label="易宝商户号" name="merchantNo">
<a-input v-model:value="form.merchantNo" placeholder="请输入易宝商户号" />
<a-select
v-model:value="form.merchantNo"
:disabled="showable"
placeholder="请选择易宝进件商户"
>
<a-select-option v-for="item in onbMchNoList" :key="item.value" :value="item.value">
{{ `${item.label || '-'}(${item.value})` }}
</a-select-option>
</a-select>
</a-form-item>
<a-divider>微信认证配置</a-divider>
<a-form-item
@@ -94,6 +102,8 @@
import { useMessage } from '@/hooks/web/useMessage'
import { BasicDrawer } from '@/components/Drawer'
import { ChannelConfig } from '@/views/daxpay/common/merchant/config/ChannelConfig.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { findByChannel } from '@/views/daxpay/common/onboarded/OnbMchInfo.api'
const { handleCancel, diffForm, labelCol, wrapperCol, confirmLoading, visible, showable } =
useFormEdit()
@@ -101,12 +111,16 @@
const formRef = ref<FormInstance>()
const channelConfig = ref<ChannelConfig>({})
const form = ref<YeePaySubConfig>({})
const onbMchNoList = ref<LabeledValue[]>([])
const form = ref<YeePaySubConfig>({
readSystem: true,
})
let rawForm: any = {}
// 校验
const rules = computed(() => {
return {
onbMchNo: [{ required: true, message: '请选择易宝进件商户' }],
enable: [{ required: true, message: '请选择是否启用' }],
merchantNo: [{ required: true, message: '请输入易宝商户号' }],
} as Record<string, Rule[]>
@@ -122,9 +136,19 @@
channelConfig.value = config
resetForm()
visible.value = true
initData()
getInfo()
}
/**
* 初始化数据
*/
function initData() {
findByChannel(channelConfig.value.mchNo, channelConfig.value.channel).then(({ data }) => {
onbMchNoList.value = data
})
}
/**
* 获取信息
*/

View File

@@ -31,15 +31,6 @@ export const dropdownByIsv = () => {
})
}
/**
* 进件通道列表
*/
export const dropdownByApply = () => {
return defHttp.get<Result<LabeledValue[]>>({
url: '/const/channel/dropdownByApply',
})
}
export interface ChannelConst extends BaseEntity {
/** 编码 */
code?: string

View File

@@ -54,7 +54,7 @@
import { LabeledValue } from 'ant-design-vue/lib/select'
import { useMessage } from '@/hooks/web/useMessage'
import { dropdown as mchAppDropdown } from '@/views/daxpay/common/assist/basic/MchAppQuery.api'
import {bindApp, bindBlank} from './CashierCode.api'
import { bindBlank } from './CashierCode.api'
const { createConfirm, createMessage } = useMessage()
const { handleCancel, confirmLoading, visible, showable, labelCol, wrapperCol } = useFormEdit()

View File

@@ -0,0 +1,95 @@
import { defHttp } from '@/utils/http/axios'
import { PageResult, Result } from '#/axios'
import { MchEntity } from '#/web'
import { LabeledValue } from 'ant-design-vue/lib/select'
/**
* 分页
*/
export function page(params) {
return defHttp.get<Result<PageResult<OnbMchInfo>>>({
url: '/onb/mch/page',
params,
})
}
/**
* 列表
*/
export function list() {
return defHttp.get<Result<OnbMchInfo[]>>({
url: '/onb/mch/list',
})
}
/**
* 详情
*/
export function get(id) {
return defHttp.get<Result<OnbMchInfo>>({
url: '/onb/mch/findById',
params: { id },
})
}
/**
* 根据进件商户号、商户号和所属通道判断是否存在
*/
export function existsByOnbMchNo(onbMchNo: string, mchNo: string, onbChannel: string) {
return defHttp.get<Result<boolean>>({
url: '/onb/mch/existsByOnbMchNo',
params: { onbMchNo, mchNo, onbChannel },
})
}
/**
* 根据所属通道查询进件商户信息
*/
export function findByChannel(mchNo, channel) {
return defHttp.get<Result<LabeledValue[]>>({
url: '/onb/mch/findByChannel',
params: { mchNo, channel },
})
}
/**
* 新增
*/
export function add(obj) {
return defHttp.post<Result<void>>({
url: '/onb/mch/add',
data: obj,
})
}
/**
* 更新
*/
export function update(obj) {
return defHttp.post<Result<void>>({
url: '/onb/mch/update',
data: obj,
})
}
/**
* 删除
*/
export function del(id) {
return defHttp.post<Result<void>>({
url: '/onb/mch/delete',
params: { id },
})
}
/**
* 进件商户信息
*/
export interface OnbMchInfo extends MchEntity {
// 进件商户号
onbMchNo?: string
// 进件商户名称
onbMchName?: string
// 所属通道
onbChannel?: string
}

View File

@@ -0,0 +1,241 @@
<template>
<basic-modal
v-bind="$attrs"
:loading="confirmLoading"
:width="750"
:title="title"
:open="visible"
:mask-closable="showable"
@cancel="handleCancel"
>
<a-spin :spinning="confirmLoading">
<a-form
class="small-from-item"
:model="form"
ref="formRef"
:validate-trigger="['blur', 'change']"
:rules="rules"
:label-col="labelCol"
:wrapper-col="wrapperCol"
>
<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">
<a-select
:filter-option="search"
v-model:value="form.mchNo"
placeholder="请选择商户"
:options="mchNoOptions"
:disabled="showable || formEditType === FormEditType.Edit"
@change="handleMchNoChange"
/>
</a-form-item>
<a-form-item label="所属通道" name="onbChannel">
<a-select
v-model:value="form.onbChannel"
:disabled="showable || formEditType === FormEditType.Edit"
placeholder="请选择所属通道"
:options="channelOptions"
@change="handleOnbChannelChange"
/>
</a-form-item>
<a-form-item label="进件商户号" name="onbMchNo" v-if="form.mchNo && form.onbChannel">
<a-input
v-model:value="form.onbMchNo"
:disabled="showable || formEditType === FormEditType.Edit"
placeholder="请输入进件商户号"
/>
</a-form-item>
<a-form-item label="进件商户名称" name="onbMchName">
<a-input
v-model:value="form.onbMchName"
:disabled="showable"
placeholder="请输入进件商户名称"
/>
</a-form-item>
</a-form>
</a-spin>
<template #footer>
<a-space>
<a-button key="cancel" @click="handleCancel">取消</a-button>
<a-button
v-if="!showable"
key="forward"
:loading="confirmLoading"
type="primary"
@click="handleOk"
>保存</a-button
>
</a-space>
</template>
</basic-modal>
</template>
<script lang="ts" setup>
import { nextTick, reactive, ref, unref } from 'vue'
import useFormEdit from '@/hooks/bootx/useFormEdit'
import { add, get, OnbMchInfo, update, existsByOnbMchNo } from './OnbMchInfo.api'
import { FormInstance, Rule } from 'ant-design-vue/lib/form'
import { FormEditType } from '@/enums/formTypeEnum'
import BasicModal from '@/components/Modal/src/BasicModal.vue'
import { useMessage } from '@/hooks/web/useMessage'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { dropdown as merchantDropdown } from '@/views/daxpay/common/assist/basic/MerchantQuery.api'
import { dropdownByEnable as channelDropdown } from '@/views/daxpay/common/constant/channel/ChannelConst.api'
const {
initFormEditType,
handleCancel,
labelCol,
wrapperCol,
modalWidth,
title,
confirmLoading,
visible,
showable,
formEditType,
search,
} = useFormEdit()
const { createMessage } = useMessage()
// 表单
const formRef = ref<FormInstance>()
const form = ref<OnbMchInfo>({})
const mchNoOptions = ref<LabeledValue[]>([])
const channelOptions = ref<LabeledValue[]>([])
// 校验
const rules = reactive({
mchNo: [{ required: true, message: '请选择商户' }],
onbMchNo: [
{ required: true, message: '请输入进件商户号' },
{
validator: async (rule, value) => {
if (!value || formEditType.value !== FormEditType.Add) {
return Promise.resolve()
}
// 确保商户和所属通道都已选择
if (!form.value.mchNo || !form.value.onbChannel) {
return Promise.resolve()
}
try {
const result = await existsByOnbMchNo(value, form.value.mchNo, form.value.onbChannel)
if (result.data) {
return Promise.reject('进件商户号已存在')
}
return Promise.resolve()
} catch (error) {
console.error('查询进件商户号失败', error)
return Promise.resolve()
}
},
},
],
onbMchName: [{ required: true, message: '请输入进件商户名称' }],
onbChannel: [{ required: true, message: '请选择所属通道' }],
} as Record<string, Rule[]>)
// 事件
const emits = defineEmits(['ok'])
/**
* 入口
*/
function init(id, editType: FormEditType) {
initFormEditType(editType)
resetForm()
if ([FormEditType.Edit, FormEditType.Show].includes(editType)) {
// 编辑和查看模式下,先加载商户数据和通道数据,再获取表单数据
Promise.all([initMerchantData(), initChannelData()]).then(() => {
getInfo(id, editType)
})
} else {
// 添加模式下,需要加载商户数据和通道数据
Promise.all([initMerchantData(), initChannelData()]).then(() => {
getInfo(id, editType)
})
}
}
/**
* 初始化商户数据
*/
function initMerchantData() {
return merchantDropdown().then(({ data }) => {
mchNoOptions.value = data
})
}
/**
* 初始化通道数据
*/
function initChannelData() {
return channelDropdown().then(({ data }) => {
channelOptions.value = data
})
}
/**
* 获取信息
*/
function getInfo(id, editType: FormEditType) {
if ([FormEditType.Edit, FormEditType.Show].includes(editType)) {
confirmLoading.value = true
get(id).then(({ data }) => {
form.value = data
confirmLoading.value = false
})
} else if (editType === FormEditType.Add) {
confirmLoading.value = false
}
}
// 保存
function handleOk() {
formRef.value?.validate().then(async () => {
confirmLoading.value = true
if (formEditType.value === FormEditType.Add) {
await add(unref(form)).finally(() => (confirmLoading.value = false))
createMessage.success('保存成功')
} else if (formEditType.value === FormEditType.Edit) {
await update(unref(form)).finally(() => (confirmLoading.value = false))
createMessage.success('保存成功')
}
handleCancel()
emits('ok')
})
}
/**
* 商户选择变化处理
*/
function handleMchNoChange() {
// 清空进件商户号
form.value.onbMchNo = ''
}
/**
* 所属通道选择变化处理
*/
function handleOnbChannelChange() {
// 清空进件商户号
form.value.onbMchNo = ''
}
/**
* 重置表单的校验
*/
function resetForm() {
nextTick(() => formRef.value?.resetFields())
}
defineExpose({
init,
})
</script>
<style lang="less" scoped></style>

View File

@@ -0,0 +1,181 @@
<template>
<div>
<div class="m-3 p-3 pt-5 bg-white">
<b-query
:query-params="model.queryParam"
:fields="fields"
:default-item-count="3"
@query="queryPage"
@reset="resetQueryParams"
/>
</div>
<div class="m-3 p-3 bg-white">
<vxe-toolbar ref="xToolbar" custom refresh :refresh-options="{ queryMethod: queryPage }">
<template #buttons>
<a-space>
<a-button type="primary" pre-icon="ant-design:plus-outlined" @click="add"
>新建</a-button
>
</a-space>
</template>
</vxe-toolbar>
<div class="h-65vh">
<vxe-table
height="auto"
ref="xTable"
:row-config="{ keyField: 'id' }"
:data="pagination.records"
:loading="loading"
>
<vxe-column type="seq" width="60" />
<vxe-column field="onbMchNo" title="进件商户号" :min-width="150">
<template #default="{ row }">
<a-link @click="show(row)">{{ row.onbMchNo }}</a-link>
</template>
</vxe-column>
<vxe-column field="onbMchName" title="进件商户名称" :min-width="150" />
<vxe-column field="onbChannel" title="所属通道" align="center" :min-width="120">
<template #default="{ row }">
{{ dictConvert('channel', row.onbChannel) }}
</template>
</vxe-column>
<vxe-column field="mchNo" title="商户号" :min-width="150" />
<vxe-column field="mchName" title="商户名称" :min-width="150" />
<vxe-column field="createTime" title="创建时间" :min-width="140" />
<vxe-column fixed="right" :width="160" :showOverflow="false" title="操作">
<template #default="{ row }">
<a-link @click="edit(row)">编辑</a-link>
<a-divider type="vertical" />
<a-popconfirm
title="是否删除该进件商户信息?"
@confirm="deleteRecord(row)"
ok-text="确认"
cancel-text="取消"
>
<a-link danger>删除</a-link>
</a-popconfirm>
</template>
</vxe-column>
</vxe-table>
</div>
<vxe-pager
size="medium"
:loading="loading"
:current-page="pagination.current"
:page-size="pagination.size"
:total="pagination.total"
@page-change="handleTableChange"
/>
<OnbMchInfoEdit ref="onbMchInfoEdit" @ok="queryPage" />
</div>
</div>
</template>
<script lang="ts" setup>
import { computed, onMounted, ref } from 'vue'
import { page, del } from './OnbMchInfo.api'
import useTablePage from '@/hooks/bootx/useTablePage'
import OnbMchInfoEdit from './OnbMchInfoEdit.vue'
import BQuery from '@/components/Bootx/Query/BQuery.vue'
import { QueryField, STRING } from '@/components/Bootx/Query/Query'
import { FormEditType } from '@/enums/formTypeEnum'
import { VxeTableInstance, VxeToolbarInstance } from 'vxe-table'
import ALink from '@/components/Link/Link.vue'
import { useMessage } from '@/hooks/web/useMessage'
import { useDict } from '@/hooks/bootx/useDict'
// 使用hooks
const {
handleTableChange,
pageQueryResHandel,
resetQueryParams,
pagination,
pages,
model,
loading,
} = useTablePage(queryPage)
const { createMessage } = useMessage()
const { dictConvert } = useDict()
// 查询条件
const fields = computed(() => {
return [
{ field: 'mchNo', type: STRING, name: '商户号', placeholder: '请输入商户号' },
{ field: 'mchName', type: STRING, name: '商户名称', placeholder: '请输入商户名称' },
{ field: 'onbMchNo', type: STRING, name: '进件商户号', placeholder: '请输入进件商户号' },
{
field: 'onbMchName',
type: STRING,
name: '进件商户名称',
placeholder: '请输入进件商户名称',
},
{ field: 'onbChannel', type: STRING, name: '所属通道', placeholder: '请输入所属通道' },
] as QueryField[]
})
const xTable = ref<VxeTableInstance>()
const xToolbar = ref<VxeToolbarInstance>()
const onbMchInfoEdit = ref<any>()
onMounted(() => {
vxeBind()
initData()
queryPage()
})
/**
* 初始化数据
*/
function initData() {
// 可以在这里初始化一些字典数据
}
function vxeBind() {
xTable.value?.connectToolbar(xToolbar.value as VxeToolbarInstance)
}
// 分页查询
function queryPage() {
loading.value = true
page({
...model.queryParam,
...pages,
}).then(({ data }) => {
pageQueryResHandel(data)
})
return Promise.resolve()
}
/**
* 新增
*/
function add() {
onbMchInfoEdit.value.init(null, FormEditType.Add)
}
/**
* 编辑
*/
function edit(record) {
onbMchInfoEdit.value.init(record.id, FormEditType.Edit)
}
/**
* 查看
*/
function show(record) {
onbMchInfoEdit.value.init(record.id, FormEditType.Show)
}
/**
* 删除
*/
function deleteRecord(record) {
del(record.id).then(() => {
createMessage.success('删除成功')
queryPage()
})
}
</script>
<style lang="less" scoped></style>