From f5ede132185909c530a4a3f84b8a27d3935cba8a Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期五, 18 九月 2026 15:52:54 +0800
Subject: [PATCH] fix(settlement): 修复结算记录页商户进件与银行卡申请的 12 处缺陷
---
talent-card-admin/src/views/MerchantOnboardingDetailView.vue | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 55 insertions(+), 4 deletions(-)
diff --git a/talent-card-admin/src/views/MerchantOnboardingDetailView.vue b/talent-card-admin/src/views/MerchantOnboardingDetailView.vue
index 098f0d9..ae6fea1 100644
--- a/talent-card-admin/src/views/MerchantOnboardingDetailView.vue
+++ b/talent-card-admin/src/views/MerchantOnboardingDetailView.vue
@@ -64,6 +64,12 @@
return /^\d{8}$/.test(result) ? `${result.slice(0, 4)}-${result.slice(4, 6)}-${result.slice(6, 8)}` : result
}
+/** 后端给的是 ISO 串(2026-09-18T14:35:49),去掉 T 和毫秒,和列表页的写法保持一致。 */
+function dateTimeText(value: unknown) {
+ if (value === undefined || value === null || value === '') return '-'
+ return String(value).replace('T', ' ').replace(/\.\d+$/, '')
+}
+
function statusLabel(value: unknown) {
return ({ pending: '待审核', approved: '已通过', rejected: '已驳回' } as Record<string, string>)[String(value || '')] || text(value)
}
@@ -101,11 +107,37 @@
<template>
<div v-loading="loading" class="onboarding-detail-page">
<section v-if="detail" class="detail-panel">
- <h3>进件状态</h3>
- <div class="status-value">{{ detail.progress ? (detail.progress.status === 'approved' ? '开通已完成' : '开通尚未完成') : statusLabel(detail.status) }}</div>
+ <h3>审核状态</h3>
+ <!-- 审核状态原来在 progress 存在时会被「开通尚未完成」顶掉,运营看不到这条进件到底审没审。
+ 两者是不同的事:审核是这条申请的结论,开通是通道能力推进到哪一步。 -->
+ <div class="status-value">{{ statusLabel(detail.status) }}</div>
+ <el-alert
+ v-if="detail.rejectReason"
+ class="reject-reason"
+ type="error"
+ :closable="false"
+ :title="`驳回原因:${detail.rejectReason}`"
+ />
+
+ <h3 class="onboarding-heading">进件信息</h3>
+ <div class="detail-grid">
+ <div class="detail-field"><span>进件编号</span><strong>{{ text(detail.applicationNo) }}</strong></div>
+ <div class="detail-field"><span>申请时间</span><strong>{{ dateTimeText(detail.createdAt) }}</strong></div>
+ <div class="detail-field"><span>商户编号</span><strong>{{ text(detail.merchantId) }}</strong></div>
+ <div class="detail-field"><span>所属门店</span><strong>{{ text(detail.storeName) }}</strong></div>
+ <div class="detail-field"><span>通道商户号</span><strong>{{ text(detail.providerHuifuId) }}</strong></div>
+ <div class="detail-field"><span>通道申请单号</span><strong>{{ text(detail.providerApplyNo || detail.providerRequestNo) }}</strong></div>
+ <div class="detail-field"><span>审核时间</span><strong>{{ dateTimeText(detail.reviewedAt) }}</strong></div>
+ <div class="detail-field"><span>最后更新时间</span><strong>{{ dateTimeText(detail.updatedAt) }}</strong></div>
+ </div>
+
+ <template v-if="detail.progress">
+ <h3 class="onboarding-heading">开通状态</h3>
+ <div class="status-value">{{ detail.progress.status === 'approved' ? '开通已完成' : '开通尚未完成' }}</div>
+ </template>
<section v-if="detail.progress" class="progress-panel">
<p>{{ detail.progress.reason }}</p>
- <p>最后成功同步:{{ text(detail.progress.lastSyncedAt) }}</p>
+ <p>最后成功同步:{{ dateTimeText(detail.progress.lastSyncedAt) }}</p>
<el-alert v-if="detail.progress.syncError" :title="detail.progress.syncError" type="warning" :closable="false" />
<div v-for="stage in detail.progress.stages" :key="stage.key" class="progress-stage">
<strong>{{ stage.label }} · {{ stageLabel(stage.status) }}</strong>
@@ -165,8 +197,26 @@
<div class="detail-field"><span>邮箱</span><strong>{{ text(detail.administratorEmail) }}</strong></div>
<div class="detail-field"><span>个人身份证人像面</span><strong><a v-if="detail.legalIdFrontUrl" :href="detail.legalIdFrontUrl" target="_blank">查看图片</a><template v-else>-</template></strong></div>
<div class="detail-field"><span>个人身份证国徽面</span><strong><a v-if="detail.legalIdBackUrl" :href="detail.legalIdBackUrl" target="_blank">查看图片</a><template v-else>-</template></strong></div>
+ </div>
+
+ <!-- 结算卡和门店照片对企业主体同样必要,原来只画在个人主体那一支:企业进件即使传了
+ 也看不到,而微信业务开通与微信实名认证都要这张店铺照片。 -->
+ <h3 class="onboarding-heading">结算银行卡</h3>
+ <div v-if="detail.initialBankCardId" class="detail-grid">
+ <div class="detail-field"><span>卡号</span><strong>{{ text(detail.settlementCardMasked) }}</strong></div>
+ <div class="detail-field"><span>开户银行</span><strong>{{ text(detail.settlementBankName) }}</strong></div>
+ <div class="detail-field"><span>开户支行</span><strong>{{ text(detail.settlementBranchName) }}</strong></div>
+ <div class="detail-field"><span>开户城市</span><strong>{{ text(detail.settlementCityName) }}</strong></div>
+ <div class="detail-field"><span>绑定状态</span><strong>{{ statusLabel(detail.settlementCardStatus) }}</strong></div>
<div class="detail-field"><span>结算银行卡卡号面</span><strong><a v-if="detail.settlementCardFrontUrl" :href="detail.settlementCardFrontUrl" target="_blank">查看图片</a><template v-else>-</template></strong></div>
- <!-- 微信业务开通与微信实名认证都要这张店铺照片,运营核对开通失败原因时要看得到。 -->
+ <div v-if="detail.settlementCardRejectReason" class="detail-field detail-field--auto-height"><span>绑定失败原因</span><strong>{{ detail.settlementCardRejectReason }}</strong></div>
+ </div>
+ <div v-else class="detail-grid">
+ <div class="detail-field"><span>结算银行卡</span><strong>未绑定</strong></div>
+ </div>
+
+ <h3 class="onboarding-heading">门店照片</h3>
+ <div class="detail-grid">
<div class="detail-field"><span>店铺照片</span><strong><a v-if="detail.storeHeaderUrl" :href="detail.storeHeaderUrl" target="_blank">查看图片</a><template v-else>-</template></strong></div>
<div class="detail-field"><span>店内环境照</span><strong><a v-if="detail.storeIndoorUrl" :href="detail.storeIndoorUrl" target="_blank">查看图片</a><template v-else>-</template></strong></div>
</div>
@@ -182,6 +232,7 @@
.detail-panel { min-height: 560px; padding: 18px 20px 54px; background: #fff; border: 1px solid #edf0f5; }
.detail-panel h3 { margin: 0; color: #1d2129; font-size: 15px; }
.status-value { margin-top: 16px; color: #1d2129; font-size: 13px; font-weight: 600; }
+.reject-reason { margin-top: 12px; }
.onboarding-heading { margin-top: 24px !important; }
.detail-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px 46px; margin-top: 22px; max-width: 1032px; }
.common-grid { margin-bottom: -2px; }
--
Gitblit v1.7.1