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