feat 通道收银台配置

This commit is contained in:
bootx
2024-09-29 23:04:56 +08:00
parent 0b8af1c74e
commit af40ab5fc1
23 changed files with 272 additions and 28 deletions

View File

@@ -1,7 +1,7 @@
/**
*
*/
export enum ChannelEnum {
export enum DaxpayEnum {
ALI = 'ali_pay',
WECHAT = 'wechat_pay',
UNION_PAY = 'union_pay',
@@ -50,3 +50,11 @@ export enum ChannelAuthStatusEnum {
/** 数据不存在 */
NOT_EXIST = 'not_exist',
}
/**
*
*/
export enum CashierTypeEnum {
WECHAT_PAY = 'wechat_pay',
ALIPAY = 'alipay',
}

View File

@@ -93,7 +93,7 @@
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'
import { useDict } from '@/hooks/bootx/useDict'
import { ChannelAuthStatusEnum } from '@/enums/daxpay/ChannelEnum'
import { ChannelAuthStatusEnum } from '@/enums/daxpay/daxpayEnum'
const { createMessage } = useMessage()
const { dictDropDown } = useDict()

View File

@@ -18,7 +18,7 @@
<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { TradeTypeEnum } from '@/enums/daxpay/ChannelEnum'
import { TradeTypeEnum } from '@/enums/daxpay/daxpayEnum'
import { useDict } from '@/hooks/bootx/useDict'
import { LabeledValue } from 'ant-design-vue/lib/select'
import DevelopTradePay from './DevelopTradePay.vue'

View File

@@ -28,7 +28,7 @@
:loading="loading"
>
<vxe-column type="seq" width="60" />
<vxe-column field="appId" title="应用号" :min-width="100" >
<vxe-column field="appId" title="应用号" :min-width="100">
<template #default="{ row }">
<a-link @click="show(row)">{{ row.appId }}</a-link>
</template>
@@ -59,6 +59,12 @@
<a-menu-item>
<a-link @click="showNotifyConfig(row)">订阅配置</a-link>
</a-menu-item>
<a-menu-item>
<a-link @click="showCashierConfig(row)">收银配置</a-link>
</a-menu-item>
<a-menu-item>
<a-link @click="showCashierQrCOde(row)">收银码牌</a-link>
</a-menu-item>
<a-menu-item>
<a-link danger @click="remove(row)">删除</a-link>
</a-menu-item>
@@ -79,6 +85,8 @@
/>
<mch-app-edit ref="mchApp" @ok="queryPage" />
<channel-config-list ref="channelSetup" />
<ChannelCashierConfigList ref="channelCashierConfigList" />
<ChannelCashierQrCode ref="channelCashierQrCode" />
<MerchantNotifyConfigList ref="merchantNotifyConfigList" />
</div>
</div>
@@ -101,6 +109,8 @@
import ChannelConfigList from '@/views/daxpay/common/merchant/channel/ChannelConfigList.vue'
import MerchantNotifyConfigList from '@/views/daxpay/common/merchant/notify/MerchantNotifyConfigList.vue'
import Icon from '@/components/Icon/Icon.vue'
import ChannelCashierConfigList from '@/views/daxpay/common/merchant/cashier/ChannelCashierConfigList.vue'
import ChannelCashierQrCode from '@/views/daxpay/common/merchant/cashier/ChannelCashierQrCode.vue'
// 使用hooks
const {
@@ -128,12 +138,15 @@
{ field: 'appName', type: STRING, name: '应用名称', placeholder: '请输入应用名称' },
] as QueryField[]
})
const mchNoOptions = ref<LabeledValue[]>([])
const xTable = ref<VxeTableInstance>()
const xToolbar = ref<VxeToolbarInstance>()
const mchApp: any = ref()
const channelSetup: any = ref()
const merchantNotifyConfigList: any = ref()
const mchNoOptions = ref<LabeledValue[]>([])
const mchApp = ref<any>()
const channelSetup = ref<any>()
const merchantNotifyConfigList = ref<any>()
const channelCashierConfigList = ref<any>()
const channelCashierQrCode = ref<any>()
onMounted(() => {
vxeBind()
@@ -191,6 +204,20 @@
merchantNotifyConfigList.value.init(record.appId)
}
/**
* 收银配置
*/
function showCashierConfig(record) {
channelCashierConfigList.value.init(record.appId)
}
/**
* 收银码牌
*/
function showCashierQrCOde(record) {
channelCashierQrCode.value.init(record.appId)
}
/**
* 删除
*/

View File

@@ -0,0 +1,72 @@
import { defHttp } from '@/utils/http/axios'
import { Result } from '#/axios'
import { MchEntity } from '#/web'
/**
* 配置列表
*/
export function findAll() {
return defHttp.get<Result<MchEntity>>({ url: '/channel/cashier/config/list' })
}
/**
* 配置详情
*/
export function get(id) {
return defHttp.get<Result<ChannelCashierConfig>>({
url: '/channel/cashier/config/findById',
params: { id },
})
}
/**
* 配置保存
*/
export function save(data: ChannelCashierConfig) {
return defHttp.post<Result<ChannelCashierConfig>>({
url: '/channel/cashier/config/save',
data,
})
}
/**
* 配置更新
*/
export function update(data: ChannelCashierConfig) {
return defHttp.post<Result<ChannelCashierConfig>>({
url: '/channel/cashier/config/update',
data,
})
}
/**
* 配置删除
*/
export function remove(id) {
return defHttp.post<Result<ChannelCashierConfig>>({
url: '/channel/cashier/config/remove',
params: { id },
})
}
/**
* 通道收银台配置
*/
export interface ChannelCashierConfig {
// 商户号
mchNo?: string
// 应用号
appId?: string
// 收银台类型
cashierType?: string
// 收银台名称
cashierName?: string
// 支付通道
channel?: string
// 支付方式
payMethod?: string
// 是否开启分账
allocation?: boolean
// 自动分账
autoAllocation?: boolean
}

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
</script>
<template>
</template>
<style scoped lang="less">
</style>

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: 1, md: 2, lg: 3, xl: 4, xxl: 5 }"
: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">
<template #description>
<template v-if="item.enable">
<a-badge dot color="green" />
<span style="color: green">已启用</span>
</template>
<template v-else-if="item.enable === false">
<a-badge dot color="red" />
<span style="color: red">未启用</span>
</template>
<template v-else>
<a-badge dot color="grey" />
<span style="color: grey">未配置</span>
</template>
</template>
</a-card-meta>
</a-card>
</template>
</a-list>
</a-spin>
</div>
<channel-cashier-config-edit ref="channelCashierConfigEdit" @ok="query" />
</basic-drawer>
</template>
<script setup lang="ts">
import { BasicDrawer } from '@/components/Drawer'
import { ref } from 'vue'
import { findAll, ChannelCashierConfig } from './ChannelCashierConfig.api'
import ChannelCashierConfigEdit from './ChannelCashierConfigEdit.vue'
const confirmLoading = ref(false)
const currentAppId = ref('')
const visible = ref(false)
/**
* 初始化并展示
*/
async function init(appId: string) {
visible.value = true
currentAppId.value = appId
query()
}
/**
* 查询
*/
function query() {
// 列表信息
confirmLoading.value = true
findAll(currentAppId.value).then(({ data }) => {
channelConfigs.value = data
confirmLoading.value = false
})
}
/**
* 打开支付设置界面
*/
function setting(record: ChannelConfig) {
channelConfigEdit.value.show(record)
}
/**
* 关闭页面
*/
function handleCancel() {
visible.value = false
}
/**
* 获取icon
*/
function getIcon(type: string) {
switch (type) {
case DaxpayEnum.ALI:
return alipay
case DaxpayEnum.WECHAT:
return wechat
case DaxpayEnum.UNION_PAY:
return unionPay
default:
return ''
}
}
</script>
<style scoped lang="less"></style>

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
</script>
<template>
</template>
<style scoped lang="less">
</style>

View File

@@ -6,7 +6,7 @@
<script setup lang="ts">
import { ref } from 'vue'
import { useMessage } from '@/hooks/web/useMessage'
import { ChannelEnum } from '@/enums/daxpay/ChannelEnum'
import { DaxpayEnum } from '@/enums/daxpay/daxpayEnum'
import { ChannelConfig } from './ChannelConfig.api'
import AlipayConfigEdit from '@/views/daxpay/common/channel/alipay/config/AlipayConfigEdit.vue'
import WechatPayConfigEdit from '@/views/daxpay/common/channel/wechat/config/WechatPayConfigEdit.vue'
@@ -24,15 +24,15 @@
*/
function show(record: ChannelConfig) {
switch (record.channel) {
case ChannelEnum.ALI: {
case DaxpayEnum.ALI: {
alipay.value.init(record)
break
}
case ChannelEnum.WECHAT: {
case DaxpayEnum.WECHAT: {
wechat.value.init(record)
break
}
case ChannelEnum.UNION_PAY: {
case DaxpayEnum.UNION_PAY: {
union.value.init(record)
break
}

View File

@@ -54,7 +54,7 @@
import { BasicDrawer } from '@/components/Drawer'
import { ref } from 'vue'
import { findAll, ChannelConfig } from './ChannelConfig.api'
import { ChannelEnum } from '@/enums/daxpay/ChannelEnum'
import { DaxpayEnum } from '@/enums/daxpay/daxpayEnum'
import alipay from '@/assets/daxpay/alipay.svg'
import wechat from '@/assets/daxpay/wechat.svg'
import unionPay from '@/assets/daxpay/unionPay.svg'
@@ -112,11 +112,11 @@
*/
function getIcon(type: string) {
switch (type) {
case ChannelEnum.ALI:
case DaxpayEnum.ALI:
return alipay
case ChannelEnum.WECHAT:
case DaxpayEnum.WECHAT:
return wechat
case ChannelEnum.UNION_PAY:
case DaxpayEnum.UNION_PAY:
return unionPay
default:
return ''

View File

@@ -89,7 +89,7 @@
import PayOrderInfo from '@/views/daxpay/common/order/pay/PayOrderInfo.vue'
import TransferOrderInfo from '@/views/daxpay/common/order/transfer/TransferOrderInfo.vue'
import NotifyRecordList from './NotifyRecordList.vue'
import { NotifyContentTypeEnum } from '@/enums/daxpay/ChannelEnum'
import { NotifyContentTypeEnum } from '@/enums/daxpay/daxpayEnum'
import RefundOrderInfo from '@/views/daxpay/common/order/refund/RefundOrderInfo.vue'
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'

View File

@@ -5,7 +5,7 @@ import {
PayAllocStatusEnum,
PayRefundStatusEnum,
PayStatusEnum,
} from '@/enums/daxpay/TradeStatusEnum'
} from '@/enums/daxpay/tradeStatusEnum'
/**
* 分页

View File

@@ -161,7 +161,7 @@
PayAllocStatusEnum,
PayRefundStatusEnum,
PayStatusEnum,
} from '@/enums/daxpay/TradeStatusEnum'
} from '@/enums/daxpay/tradeStatusEnum'
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'

View File

@@ -6,7 +6,7 @@ import {
PayRefundStatusEnum,
PayStatusEnum,
RefundStatusEnum,
} from '@/enums/daxpay/TradeStatusEnum'
} from '@/enums/daxpay/tradeStatusEnum'
/**
* 分页

View File

@@ -128,7 +128,7 @@
import PayOrderInfo from '../pay/PayOrderInfo.vue'
import { LabeledValue } from 'ant-design-vue/lib/select'
import ALink from '@/components/Link/Link.vue'
import { RefundStatusEnum } from '@/enums/daxpay/TradeStatusEnum'
import { RefundStatusEnum } from '@/enums/daxpay/tradeStatusEnum'
import { Icon } from '@/components/Icon'
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'

View File

@@ -1,7 +1,7 @@
import { defHttp } from '@/utils/http/axios'
import { PageResult, Result } from '#/axios'
import { MchEntity } from '#/web'
import { TransferStatusEnum } from '@/enums/daxpay/TradeStatusEnum'
import { TransferStatusEnum } from '@/enums/daxpay/tradeStatusEnum'
/**
* 分页

View File

@@ -125,7 +125,7 @@
import { useDict } from '@/hooks/bootx/useDict'
import { LabeledValue } from 'ant-design-vue/lib/select'
import ALink from '/@/components/Link/Link.vue'
import { TransferStatusEnum } from '@/enums/daxpay/TradeStatusEnum'
import { TransferStatusEnum } from '@/enums/daxpay/tradeStatusEnum'
import { Icon } from '@/components/Icon'
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'

View File

@@ -118,7 +118,7 @@
import BQuery from '/@/components/Bootx/Query/BQuery.vue'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { useDict } from '@/hooks/bootx/useDict'
import { TradeTypeEnum } from '@/enums/daxpay/ChannelEnum'
import { TradeTypeEnum } from '@/enums/daxpay/daxpayEnum'
import ReconcileDiscrepancyInfo from './ReconcileDiscrepancyInfo.vue'
import ReconcileStatementInfo from '../statement/ReconcileStatementInfo.vue'
import PayOrderInfo from '@/views/daxpay/common/order/pay/PayOrderInfo.vue'

View File

@@ -1,7 +1,7 @@
import { defHttp } from '@/utils/http/axios'
import { PageResult, Result } from '#/axios'
import { MchEntity } from '#/web'
import { CallbackStatusEnum } from '@/enums/daxpay/TradeStatusEnum'
import { CallbackStatusEnum } from '@/enums/daxpay/tradeStatusEnum'
/**
* 分页

View File

@@ -87,7 +87,7 @@
import PayOrderInfo from '@/views/daxpay/common/order/pay/PayOrderInfo.vue'
import RefundOrderInfo from '@/views/daxpay/common/order/refund/RefundOrderInfo.vue'
import TransferOrderInfo from '@/views/daxpay/common/order/transfer/TransferOrderInfo.vue'
import { TradeTypeEnum } from '@/enums/daxpay/ChannelEnum'
import { TradeTypeEnum } from '@/enums/daxpay/daxpayEnum'
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'

View File

@@ -97,7 +97,7 @@
import TransferOrderInfo from '@/views/daxpay/common/order/transfer/TransferOrderInfo.vue'
import ALink from '@/components/Link/Link.vue'
import TradeFlowRecordInfo from './TradeFlowRecordInfo.vue'
import { TradeTypeEnum } from '@/enums/daxpay/ChannelEnum'
import { TradeTypeEnum } from '@/enums/daxpay/daxpayEnum'
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'

View File

@@ -83,7 +83,7 @@
import BQuery from '@/components/Bootx/Query/BQuery.vue'
import { LIST, QueryField, STRING } from '@/components/Bootx/Query/Query'
import { useDict } from '@/hooks/bootx/useDict'
import { TradeTypeEnum } from '@/enums/daxpay/ChannelEnum'
import { TradeTypeEnum } from '@/enums/daxpay/daxpayEnum'
import { LabeledValue } from 'ant-design-vue/lib/select'
import ALink from '/@/components/Link/Link.vue'
import PayOrderInfo from '@/views/daxpay/common/order/pay/PayOrderInfo.vue'