+
('table')
/** TODO: 路由 path 需与你配置的菜单 path 保持一致,例如实际为 /payment/orders 时请同步修改 */
const ROUTES = {
@@ -212,16 +139,6 @@ const ROUTES = {
} as Record
}
-/** 渠道图标映射(图标名与 ChannelCard 组件保持一致) */
-const CHANNEL_ICONS: Record = {
- ChatDotRound,
- Wallet,
- CreditCard,
- Lightning,
- Money
-}
-const channelIcon = (icon: string) => CHANNEL_ICONS[icon] || Money
-
/* ---------------- 渠道概览 ---------------- */
interface ChannelRow {
@@ -233,20 +150,48 @@ interface ChannelRow {
remark: string
}
+const DEFAULT_CHANNEL_META: Record = {
+ wechat: {
+ name: '微信支付',
+ icon: 'ChatDotRound',
+ remark: 'JSAPI / Native 扫码收款,平台使用费主渠道'
+ },
+ alipay: {
+ name: '支付宝',
+ icon: 'Wallet',
+ remark: '电脑网站支付 / 手机网站支付'
+ },
+ unionpay: {
+ name: '银联',
+ icon: 'CreditCard',
+ remark: '银联全渠道收单,需上传商户证书'
+ },
+ cloudpay: {
+ name: '云闪付',
+ icon: 'Lightning',
+ remark: '复用银联商户参数,仅控制收银台是否展示云闪付标识'
+ },
+ paypal: {
+ name: 'PayPal',
+ icon: 'Money',
+ remark: '面向港澳台及海外租户,当前无跨境需求,默认关闭'
+ }
+}
+
const channelList = ref([
{
channel: 'wechat',
name: '微信支付',
- status: 'enabled',
- merchant_no: '1620888999',
+ status: 'unconfigured',
+ merchant_no: '',
icon: 'ChatDotRound',
remark: 'JSAPI / Native 扫码收款,平台使用费主渠道'
},
{
channel: 'alipay',
name: '支付宝',
- status: 'enabled',
- merchant_no: '2088123456789012',
+ status: 'unconfigured',
+ merchant_no: '',
icon: 'Wallet',
remark: '电脑网站支付 / 手机网站支付'
},
@@ -261,15 +206,15 @@ const channelList = ref([
{
channel: 'cloudpay',
name: '云闪付',
- status: 'disabled',
- merchant_no: '898110158000000',
+ status: 'unconfigured',
+ merchant_no: '',
icon: 'Lightning',
remark: '复用银联商户参数,仅控制收银台是否展示云闪付标识'
},
{
channel: 'paypal',
name: 'PayPal',
- status: 'disabled',
+ status: 'unconfigured',
merchant_no: '',
icon: 'Money',
remark: '面向港澳台及海外租户,当前无跨境需求,默认关闭'
@@ -331,34 +276,66 @@ interface RecentOrder {
const recentOrders = ref([])
-/** 最近 10 条:TODO 换成 getOrders({ page: 1, pageSize: 10 }) */
-function loadRecentOrders() {
- recentOrders.value = [
- { pay_no: 'P202609150009', tenant_name: '杭州云泽科技有限公司', amount: 299900, channel: 'wechat', status: 'paid', create_time: '2026-09-15 10:24:31' },
- { pay_no: 'P202609150008', tenant_name: '宁波海曙贸易有限公司', amount: 99900, channel: 'alipay', status: 'paid', create_time: '2026-09-15 09:58:02' },
- { pay_no: 'P202609150007', tenant_name: '上海弘远信息技术有限公司', amount: 199900, channel: 'wechat', status: 'pending', create_time: '2026-09-15 09:31:47' },
- { pay_no: 'P202609150006', tenant_name: '深圳市博通电子商务有限公司', amount: 499900, channel: 'alipay', status: 'paid', create_time: '2026-09-15 09:12:15' },
- { pay_no: 'P202609150005', tenant_name: '北京中科智联科技有限公司', amount: 99900, channel: 'wechat', status: 'failed', create_time: '2026-09-15 08:56:39' },
- { pay_no: 'P202609140021', tenant_name: '成都天府软件有限公司', amount: 299900, channel: 'wechat', status: 'paid', create_time: '2026-09-14 18:42:10' },
- { pay_no: 'P202609140020', tenant_name: '武汉光谷数字科技有限公司', amount: 199900, channel: 'alipay', status: 'closed', create_time: '2026-09-14 17:20:55' },
- { pay_no: 'P202609140019', tenant_name: '西安丝路网络科技有限公司', amount: 99900, channel: 'wechat', status: 'paid', create_time: '2026-09-14 16:05:23' },
- { pay_no: 'P202609140018', tenant_name: '青岛海洋装备有限公司', amount: 599900, channel: 'alipay', status: 'paid', create_time: '2026-09-14 14:48:07' },
- { pay_no: 'P202609140017', tenant_name: '长沙湘江云计算有限公司', amount: 299900, channel: 'wechat', status: 'refunded', create_time: '2026-09-14 11:33:41' }
- ]
+/** 最近 10 条 */
+async function loadRecentOrders() {
+ try {
+ const res: any = await getOrders({ page: 1, pageSize: 10 })
+ if (res?.code === 200 && res.data) {
+ const list = res.data.list || []
+ recentOrders.value = list.map((item: any) => ({
+ pay_no: item.pay_no,
+ tenant_name: item.tenant_name || '-',
+ amount: item.amount,
+ channel: item.channel,
+ status: item.status,
+ create_time: item.create_time
+ }))
+ }
+ } catch (error: any) {
+ console.error('加载最近交易失败:', error)
+ }
}
/* ---------------- 数据加载与操作 ---------------- */
async function fetchChannels() {
- // TODO: 接口联通后替换为真实请求
- // const res = await getChannelList()
- // if (res.success) channelList.value = res.data.list || res.data || []
+ try {
+ const res: any = await getChannelList()
+ if (res?.code === 200 && res.data) {
+ const list = res.data.list || []
+ channelList.value = list.map((item: any) => {
+ const meta = DEFAULT_CHANNEL_META[item.channel] || {
+ name: item.name,
+ icon: 'Money',
+ remark: ''
+ }
+ let status: 'enabled' | 'disabled' | 'unconfigured' = 'unconfigured'
+ if (item.status) {
+ status = item.status
+ } else if (item.enabled) {
+ status = 'enabled'
+ } else if (item.merchant_no || item.has_config || item.last_test_result) {
+ status = 'disabled'
+ }
+ return {
+ channel: item.channel,
+ name: item.name || meta.name,
+ status,
+ merchant_no: item.merchant_no || '',
+ icon: meta.icon || 'Money',
+ remark: item.remark || meta.remark || ''
+ }
+ })
+ }
+ } catch (error: any) {
+ ElMessage.error(error?.response?.data?.msg || error?.message || '获取渠道列表失败')
+ }
}
async function fetchData() {
loading.value = true
try {
- await Promise.all([fetchChannels(), Promise.resolve(loadRecentOrders())])
+ await Promise.allSettled([fetchChannels(), loadRecentOrders()])
} catch (error: any) {
ElMessage.error(error?.message || '加载支付概览失败')
} finally {
@@ -390,9 +367,17 @@ function goOrderDetail(row: RecentOrder) {
}
async function toggleChannelStatus(row: ChannelRow, enable: boolean) {
- // TODO: 接口联通后替换为 toggleChannel(row.channel, enable)
- row.status = enable ? 'enabled' : 'disabled'
- ElMessage.success(`${row.name}已${enable ? '启用' : '停用'}`)
+ try {
+ const res: any = await toggleChannel(row.channel, enable)
+ if (res?.code === 200) {
+ row.status = enable ? 'enabled' : 'disabled'
+ ElMessage.success(`${row.name}已${enable ? '启用' : '停用'}`)
+ } else {
+ ElMessage.error(res?.msg || '操作失败')
+ }
+ } catch (error: any) {
+ ElMessage.error(error?.response?.data?.msg || error?.message || '操作失败')
+ }
}
/* ---------------- 工具函数 ---------------- */
@@ -472,13 +457,15 @@ onMounted(() => {
gap: 16px;
}
-.channel-cell {
- display: flex;
- align-items: center;
- gap: 8px;
+@media (max-width: 1200px) {
+ .channel-card-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
- .channel-icon {
- color: #409eff;
+@media (max-width: 768px) {
+ .channel-card-grid {
+ grid-template-columns: 1fr;
}
}